2011-09-06 6 views
6

Je dois trouver le nombre de lignes d'un UITextView. Il n'y a pas de propriété disponible, comme un numberOfLines, sur UITextView. J'utilise la formule suivante, mais cela ne fonctionne pas. Est-ce que quelqu'un a une idée à ce sujet?Comment trouver UITextVoir le nombre de lignes

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

Répondre

19

Si vous utilisez iOS 3, vous devez utiliser la leading propriété:

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

Si vous utilisez iOS 4, vous devez utiliser la propriété lineHeight:

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

Et, comme l'a souligné @thomas, faites attention aux arrondis si vous avez besoin d'un résultat exact.

+1

en outre: la formule produit une valeur en virgule flottante qui est coulé en int (se termine avec inférieur lié). Peut-être arrondir le résultat conduit à de meilleurs résultats: 'int numLines = round (...)' alors un résultat de 0,9999 conduit à 1 et non à 0 – thomas

+0

@thomas: True. J'ai ajouté ceci à la réponse. –

1

Vous pouvez regarder la propriété contentSize de votre UITextView pour obtenir la hauteur du texte en pixels, et diviser par l'espacement des lignes de la police du UITextView pour obtenir le nombre de lignes de texte dans la UIScrollView totale (sur et hors écran), incluant à la fois le texte enveloppé et le texte brisé.

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

Swift 4 façon de calculer le nombre de lignes dans UITextView utilisant 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

Ne compile pas 'La valeur du type 'ComparisonResult' n'a pas de membre 'same''. Une extension privée? – Pahnev

Questions connexes