2016-07-18 116 views
5

Voglio disegnare un paragrafo (quindi suppongo di usare CTFrameDraw o ctlinedraw) ma devo anche troncare il testo se non rientra nell'area definita (rect). Di solito tagliamo l'ultima linea aggiungendo un'ellissi (cioè i caratteri '...') Come fare questo? Come fare questo con caratteri speciali come '... [+]'IOS come troncare con ellissi l'ultima linea visibile di un paragrafo?

Inoltre, vorrei sapere come specificare un rientro (in pixel) per la prima riga e se è possibile de definire personalizzato interlinea

e per finire, ho bisogno di sapere l'esatto rect finale che si adatta esattamente l'intero paragrafo (è forse inferiore alla zona definita)

risposta

0

Copia il seguente codice per viewDidLoad in un progetto di test.

// Set the size of the area the paragraph will be drawn in. 
CGSize sizeOfTextArea = CGSizeMake(200.0f, 100.0f); 

// Sample text and views. 
NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, sizeOfTextArea.width, sizeOfTextArea.height)]; 
imageView.backgroundColor = [UIColor whiteColor]; 
[self.view addSubview:imageView]; 
self.view.backgroundColor = [UIColor blackColor]; 
CGRect textRect = imageView.frame; 
UIButton *moreBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
moreBtn.frame = CGRectMake(CGRectGetMaxX(textRect)-45, CGRectGetMaxY(textRect), 45, 20); 
[moreBtn setTitle:@"more" forState:UIControlStateNormal]; 
[self.view addSubview:moreBtn]; 

// Create a paragraph style and add it to attributed text options. 
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
style.firstLineHeadIndent = 10.0f; // <- CHANGE THIS TO ADJUST INDENT 
style.lineSpacing = 10.0f;   // <- CHANGE THIS TO ADJUST LINE SPACING 
NSDictionary *attributes = @{NSParagraphStyleAttributeName : style}; 

// Render the text 
// The options set the text to word-wrap and to add an ellipsis if needed. 
UIGraphicsBeginImageContext(sizeOfTextArea); 
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes]; 
[attributedText drawWithRect:CGRectMake(0, 0, sizeOfTextArea.width, sizeOfTextArea.height) 
        options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine 
        context:nil]; 
UIImage *renderedText = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Display the rendered text. 
imageView.image = renderedText; 

// Calculate the rect for the full text. We fix the width and let iOS calculate the height. 
CGRect fullTextRect = [attributedText boundingRectWithSize:CGSizeMake(sizeOfTextArea.width, CGFLOAT_MAX) 
                options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading 
                context:nil]; 
NSLog(@"full rect: %@", NSStringFromCGRect(fullTextRect)); 

// Show/hide more button depending on whether there's more text to show 
moreBtn.hidden = CGRectGetHeight(fullTextRect) <= sizeOfTextArea.height; 

Per quanto riguarda il [+] dopo i puntini di sospensione, aggiungere un pulsante 'piu' posto dopo il testo che viene visualizzato o nascosto a seconda che ci sia più testo da visualizzare (vedere il codice qui sopra per vedere cosa intendo).

+0

grazie a jp2g ma non capisco come sostituire il '...' con qualcosa come '... [+]' o qualcosa del tipo "... altro"? – loki

+0

@loki: ho aggiornato il codice di esempio per includere un pulsante "altro". – jp2g

+0

ooh vedo come si fa, si posiziona il pulsante nella parte superiore del testo infatti :(questa è un'idea, ma questo non restituirà un risultato bello perché il testo verrà troncato ovunque, come per esempio nel mezzo di un char :( – loki

0
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; 
    paragraph.lineBreakMode = NSLineBreakByTruncatingTail; 
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, [attributedString length])]; 
    descriptionLabel.attributedText = attributedString; 

Usa sopra il codice e alla vostra UIelement etichetta o pulsante mi piace questo .U otterrà ellissi all'ultima riga. E ho anche provato ad aggiungere una stringa alla fine, ma non l'ho fatto. perché in un'area limitata l'etichetta mostra le informazioni in forma solo le pellicole rimanenti. Su quella linea si intende ad eccezione di ellissi ho provato un po 'di testo. Spiacente per dare meno informazioni.