IOS, как усечь с помощью многоточия последнюю видимую строку абзаца?

Я хочу нарисовать абзац (поэтому я думаю, используя CTFrameDraw или ctlinedraw), но мне также нужно обрезать текст, если он не помещается в определенной области (прямоугольник). Обычно мы обрезаем последнюю строку, добавляя многоточие (то есть символы "..."). Как это сделать? Как это сделать с помощью специального символа типа '...[+]'

Кроме того, я хотел бы знать, как указать отступ (в пикселях) для самой первой строки и, если это возможно, определить пользовательский межстрочный интервал

и чтобы закончить, мне нужно знать точный окончательный прямоугольник, который будет соответствовать точно всему абзацу (он может быть ниже определенной области)

2 ответа

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

Используйте вышеуказанный код и ваш UIelement метка или кнопка, как это.U получит эллипсы в последней строке. И я также пытался добавить строку в конце, но я этого не сделал. потому что в ограниченной области метка показывает информацию о соответствии только оставшимся шкурам. На этой строке означает, кроме эллипсов, я попробовал некоторый текст.

Скопируйте следующий код в viewDidLoad в тестовом проекте.

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

Для [+] после многоточия добавьте кнопку "еще" вместо текста, который будет показан или скрыт, в зависимости от того, есть ли текст для отображения (см. приведенный выше код, чтобы понять, что я имею в виду).

Другие вопросы по тегам