2011-09-06 8 views
6

Tengo que encontrar el número de líneas de UITextView. No hay ninguna propiedad disponible, como numberOfLines, en UITextView. Uso la siguiente fórmula, pero no funciona. ¿Alguien tiene una idea sobre esto?Cómo encontrar el número de líneas de UITextView

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

Respuesta

19

Si está utilizando IOS 3, es necesario utilizar el leading propiedad:

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

Si está utilizando IOS 4, es necesario utilizar el lineHeight propiedad:

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

Y, como señaló @thomas, tenga cuidado de redondear si necesita un resultado exacto.

+1

además: la fórmula produce un punto valor flotante que se proyecta a int (termina con un menor ligado). Tal vez redondear el resultado conduzca a mejores resultados: 'int numLines = round (...)' luego un resultado de 0.9999 lleva a 1 y no a 0 – thomas

+0

@thomas: Es cierto. Agregué esto a la respuesta. –

1

Usted puede mirar en la propiedad contentSize de su UITextView para obtener la altura del texto en píxeles, y se divide por el espaciado de línea de la fuente del UITextView para obtener el número de líneas de texto en el UIScrollView totales (en y fuera de la pantalla), incluidos tanto el texto envuelto como el texto roto.

int numLines = txtview.contentSize.height/txtview.font.leading; 
1

Swift 4 manera de calcular el número de líneas en UITextView usando UITextInputTokenizer:

public extension UITextView { 
    /// number of lines based on entered text 
    public var numberOfLines: Int { 
     guard compare(beginningOfDocument, to: endOfDocument).same == false else { 
      return 0 
     } 
     let direction: UITextDirection = UITextStorageDirection.forward.rawValue 
     var lineBeginning = beginningOfDocument 
     var lines = 0 
     while true { 
      lines += 1 
      guard let lineEnd = tokenizer.position(from: lineBeginning, toBoundary: .line, inDirection: direction) else { 
       fatalError() 
      } 
      guard compare(lineEnd, to: endOfDocument).same == false else { 
       break 
      } 
      guard let newLineBeginning = tokenizer.position(from: lineEnd, toBoundary: .character, inDirection: direction) else { 
       fatalError() 
      } 
      guard compare(newLineBeginning, to: endOfDocument).same == false else { 
       return lines + 1 
      } 
      lineBeginning = newLineBeginning 
     } 
     return lines 
    } 
} 

public extension ComparisonResult { 

    public var ascending: Bool { 
     switch self { 
     case .orderedAscending: 
      return true 
     default: 
      return false 
     } 
    } 

    public var descending: Bool { 
     switch self { 
     case .orderedDescending: 
      return true 
     default: 
      return false 
     } 
    } 

    public var same: Bool { 
     switch self { 
     case .orderedSame: 
      return true 
     default: 
      return false 
     } 
    } 
} 
+0

No compila 'Valor del tipo 'ComparisonResult' no tiene miembro 'same''. ¿Alguna extensión privada? – Pahnev

Cuestiones relacionadas