Contando el número de líneas en una UITextView, líneas envueltas por tamaño de fotogtwig

Quería saber cuando un texto está envuelto por el marco de la vista de texto ¿hay algún delimitador con el que podamos identificar si el texto fue envuelto o no?

Por ejemplo, si mi vista de texto tiene un ancho de 50 px y el texto excede eso, envuelve el texto en la siguiente línea.

Quería contar el número de líneas en mi vista de texto. Ahora “\ n” y “\ r” no me están ayudando.

Mi código es:

NSCharacterSet *aCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"\n\r"]; NSArray *myArray = [textViewText componentsSeparatedByCharactersInSet:aCharacterSet]; NSLog(@"%d",[myArray count]); 

Esta variación tiene en cuenta cómo ajusta sus líneas y el tamaño máximo de UITextView , y puede generar una altura más precisa. Por ejemplo, si el texto no cabe, se truncará al tamaño visible, y si envuelve palabras completas (que es el valor predeterminado) puede dar como resultado más líneas que si lo hace de otra manera.

 UIFont *font = [UIFont boldSystemFontOfSize:11.0]; CGSize size = [string sizeWithFont:font constrainedToSize:myUITextView.frame.size lineBreakMode:UILineBreakModeWordWrap]; // default mode float numberOfLines = size.height / font.lineHeight; 

Necesita usar la propiedad lineHeight y la línea de fuente lineHeight :

C objective

 int numLines = txtview.contentSize.height / txtview.font.lineHeight; 

Rápido

 let numLines = (txtview.contentSize.height / txtview.font.lineHeight) as? Int 

Obtengo la cantidad correcta de líneas, espero que también te ayude.

Swift 3:

 let layoutManager:NSLayoutManager = textView.layoutManager let numberOfGlyphs = layoutManager.numberOfGlyphs var numberOfLines = 0 var index = 0 var lineRange:NSRange = NSRange() while (index < numberOfGlyphs) { layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange) index = NSMaxRange(lineRange); numberOfLines = numberOfLines + 1 } print(numberOfLines) 

Encontré la solución perfecta para este problema en la Guía de progtwigción de diseño de texto de Apple. Esta es la solución que proporciona Apple:

 NSLayoutManager *layoutManager = [textView layoutManager]; unsigned numberOfLines, index; unsigned numberOfGlyphs = [layoutManager numberOfGlyphs]; NSRange lineRange; for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){ (void) [layoutManager lineFragmentRectForGlyphAtIndex:index effectiveRange:&lineRange]; index = NSMaxRange(lineRange); } 

Esto podría escribirse fácilmente en una extensión para UITextView, o como un método independiente que toma un objeto UITextView como parámetro

Extensión Swift:

Usando @himanshu padia respuesta

 //MARK: - UITextView extension UITextView{ func numberOfLines() -> Int{ if let fontUnwrapped = self.font{ return Int(self.contentSize.height / fontUnwrapped.lineHeight) } return 0 } } 

Uso: yourTextView.numberOfLines()

tenga en cuenta que si por alguna razón la fuente de la vista de texto es nula, la devolución será cero.

Debe considerar textView.textContainerInset, también debe redondear el valor calculado ya que el número de línea definitivamente es un número entero

 float rawLineNumber = (textView.contentSize.height - textView.textContainerInset.top - textView.textContainerInset.bottom) / textView.font.lineHeight; int finalLineNumber = round(rawLineNumber) 

En el caso real, puede ver el resultado siguiente rawLineNumber = 3.008099 finalLineNumber = 3 (3 líneas)

Use esto (donde _text_v es su vista de texto):

 -(NSInteger) linesCount { return _text_v.contentSize.height/_text_v.font.lineHeight; } 
  func numberOfLines(textView: UITextView) -> Int { let layoutManager = textView.layoutManager let numberOfGlyphs = layoutManager.numberOfGlyphs var lineRange: NSRange = NSMakeRange(0, 1) var index = 0 var numberOfLines = 0 while index < numberOfGlyphs { layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange) index = NSMaxRange(lineRange) numberOfLines += 1 } return numberOfLines } 

Trabajando bien para mi