2016-07-18 19 views
5

Chcę narysować akapit (tak myślę, używając CTFrameDraw lub ctlinedraw), ale muszę również skrócić tekst, jeśli nie pasuje w określonym obszarze (rect). Zwykle przycinamy ostatnią linię dodając elipsę (tj. Znaki "..."). Jak to zrobić? Jak to zrobić ze specjalnym znakiem typu "... [+]"IOS jak obcinać za pomocą elipsy ostatnią widoczną linię akapitu?

Chciałbym również wiedzieć, jak określić wcięcie (w pikselach) dla pierwszej linii i jeśli jest to możliwe, zdefiniuj niestandardowe linespacing

i do końca, muszę znać dokładną ostateczną rect, który będzie pasował dokładnie cały paragraf (to może być niższy niż na określonym obszarze)

Odpowiedz

0

Skopiuj poniższy kod, żeby viewDidLoad w projekcie badawczym.

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

chodzi o [+] po elipsy, dodać przycisk „więcej” zamiast po tekście, który zostanie pokazany lub ukryty w zależności od tego, czy jest więcej tekstu, aby pokazać (patrz powyższy kod, aby zobaczyć, co mam na myśli).

+0

dziękuję jp2g, ale nie rozumiem, jak zastąpić "..." czymś takim jak "... [+]" lub coś w stylu "... więcej"? – loki

+0

@loki: Zaktualizowałem przykładowy kod, dodając przycisk "więcej". – jp2g

+0

ooh, widzę, jak to robisz, umieszczasz przycisk w górnej części tekstu :(to jest pomysł, ale to nie zwróci pięknego wyniku, ponieważ tekst zostanie obcięty wszędzie, jak na przykład w środku a char :( – loki

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

Zastosowanie powyższego kodu i do etykiety UIelement lub przycisku jak ten .ui dostanie elipsy w ostatniej kolejce. I próbuję również dołączyć ciąg na końcu, ale nie zrobił. ponieważ w ograniczonym obszarze na etykiecie widoczne są tylko informacje pasujące, ale pozostają ukryte. W tym wierszu oznacza się, że oprócz elips, próbowałem tekstu. Aby podać mniej informacji.

Powiązane problemy