2011-09-06 117 views
6

我必須找到一個UITextView的行數。沒有可用的財產,如numberOfLinesUITextView。我使用下面的公式,但它不起作用。有人對此有所瞭解嗎?如何找到UITextView的行數

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

回答

19

如果您使用的是iOS 3,您需要使用leading屬性:

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

如果您使用的是iOS 4,您需要使用lineHeight屬性:

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

而且,正如@托馬斯指出的那樣,如果您需要精確的結果,請小心四捨五入。

+1

:式產生被轉換爲INT(具有較低結束一個浮點值界)。也許四捨五入的結果導致更好的結果:'int numLines = round(...)'那麼0.9999的結果會導致1而不是0 – thomas

+0

@thomas:True。我將這添加到答案中。 –

1

你可以看看你的UITextView的contentSize屬性來獲取以像素爲 文本的高度,再除以UITextView的字體的行間距以獲得 數量在總的UIScrollView文本行(上關閉屏幕),包括包裝和線條斷裂的文本。

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

夫特4的方法來計算在UITextView行數使用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

不能編譯'CompareResult'類型的值沒有成員'same'。一些私人分機? – Pahnev