2016-07-18 13 views
5

Ich möchte einen Absatz (ich denke, mit CTFrameDraw oder Ctlinedraw) aber ich muss auch den Text abgeschnitten, wenn es nicht in den definierten Bereich (Rect) passen. Normalerweise schneiden wir die letzte Zeile durch Anfügen einer Ellipse (dh die Zeichen '...') Wie geht das? Wie man das mit speziellen Zeichen wie '... [+]' machtIOS wie man mit der Ellipse die letzte sichtbare Zeile eines Absatzes abschneidet?

Auch würde ich gerne wissen, wie man einen Einrückung (in Pixel) für die allerersten Zeile angeben und wenn es möglich ist, benutzerdefinierte definieren

Zeilenabstand und zu beenden, ich brauche die genaue endgültige rect zu wissen, dass genau die volle Absatz passt (es ist vielleicht niedriger als der Bereich definiert)

Antwort

0

Kopieren sie den folgenden Code zu viewDidLoad in einem Testprojekt.

// 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; 

Was die [+] nach dem Auslassungszeichen, fügen Sie eine ‚mehr‘ Taste stattdessen nach dem Text, der je nach ein- oder ausgeblendet wird, ob es mehr Text (siehe den obigen Code, um zu sehen, was ich meine) zu zeigen.

+0

danke jp2g, aber ich verstehe nicht, wie man das '...' durch etwas wie '... [+]' oder etwas wie "... mehr" ersetzt? – loki

+0

@loki: Ich habe den Beispielcode so aktualisiert, dass er einen 'more' Button enthält. – jp2g

+0

Ooh ich sehe, wie Sie tun, setzen Sie den Button in der Spitze des Textes in der Tat :(Dies ist eine Idee, aber dies wird kein schönes Ergebnis zurückgeben, weil der Text überall abgeschnitten wird, wie zum Beispiel in der Mitte ein Zeichen :( – loki

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

Verwenden obiger Code und Ihr UIelement Label Taste oder ähnlichen .U werden Ellipsen in der letzten Zeile erhalten. Und ich werde auch versucht, Schnur am Ende anzufügen, aber ich tat nicht. weil in begrenztem Bereich das Etikett Passungsinformationen nur übrig bleibt versteckt. Auf dieser Linie bedeutet, dass außer Ellipsen habe ich versucht, einige Text.Sorry, weniger Informationen zu geben.