2011-09-06 34 views
6

Tôi phải tìm số dòng là UITextView. Không có bất động sản nào, như là numberOfLines, trên UITextView. Tôi sử dụng công thức sau đây, nhưng nó không hoạt động. Có ai có ý tưởng về điều này không?Cách tìm số dòng UITextView

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

Trả lời

19

Nếu bạn đang sử dụng iOS 3, bạn cần phải sử dụng leading tài sản:

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

Nếu bạn đang sử dụng iOS 4, bạn cần phải sử dụng lineHeight tài sản:

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

Và, như @thomas đã chỉ ra, hãy cẩn thận làm tròn nếu bạn cần kết quả chính xác.

+1

ngoài: công thức tạo ra một dấu chấm động có giá trị được đúc để int (kết thúc với thấp bị ràng buộc). Có thể làm tròn kết quả dẫn đến kết quả tốt hơn: 'int numLines = round (...)' sau đó kết quả là 0,9999 dẫn đến 1 và không phải là 0 – thomas

+0

@thomas: Đúng. Tôi đã thêm điều này vào câu trả lời. –

1

Bạn có thể xem thuộc tính contentSize của UITextView để nhận chiều cao của văn bản tính bằng pixel và chia khoảng cách dòng của phông chữ UITextView để nhận số dòng văn bản trong tổng UIScrollView (bật và tắt màn hình), bao gồm cả văn bản bị ngắt dòng và bị ngắt dòng.

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

Swift 4 cách để tính toán số lượng dòng trong UITextView sử dụng 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

Không biên dịch 'Giá trị loại 'So sánhResult' không có thành viên 'giống nhau'. Một số tiện ích mở rộng riêng tư? – Pahnev

Các vấn đề liên quan