¿IOS cómo truncar con elipsis la última línea visible de un párrafo?

Quiero dibujar un párrafo (supongo que utilizando CTFrameDraw o ctlinedraw) pero también necesito truncar el text si no cabe en el área definida (rect). Normalmente, recortamos la última línea al agregar una elipse (es decir, los caracteres '…') ¿Cómo hacer esto? Cómo hacer esto con caracteres especiales como '… [+]'

Además, me gustaría saber cómo especificar una sangría (en píxeles) para la primera línea y si es posible definir el espaciado de líneas personalizado

y para terminar, necesito saber el rectángulo final exacto que se ajustará exactamente al párrafo completo (es quizás más bajo que el área definida)

Copie el siguiente código para viewDidLoad en un proyecto de testing.

 // 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 *rendenetworkingText = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Display the rendenetworking text. imageView.image = rendenetworkingText; // 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; 

En cuanto a [+] después de los puntos suspensivos, agrega un button 'más' después del text que se muestra u oculta dependiendo de si hay más text para mostrar (mira el código anterior para ver a qué me refiero).

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

Use el código anterior y su label UIelement o button como este .U obtendrá elipses en la última línea. Y también intenté agregar cadena al final, pero no lo hice. porque en un área limitada, la label muestra información apta solo queda oculta. En esa línea significa, excepto elipses, probé un poco de text. Me da ganas de dar less información.