2017-08-30 79 views
4

我目前在UITextField上有以下擴展來計算給定字符串的邊界矩形。UITextView的boundingRect工作不正常

func widthHeight(font: UIFont) -> CGRect { 
    let constraintRect = CGSize(width: 200, height: 1000) 
    let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 
    return boundingBox 
} 

constraintRect的寬度是我希望允許的最大寬度。

我設置的值和細胞​​是這樣的:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuse, for: indexPath) as? ChatCollectionViewCell { 

     let text = self.chatLog[indexPath.row].text 
     cell.chatTextView.text = text 

     cell.chatViewWidth = (text?.widthHeight(font: UIFont.systemFont(ofSize: 16)).width)! 

     return cell 
    } 
    return UICollectionViewCell() 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    if let text = self.chatLog[indexPath.row].text {    
     let box = text.widthHeight(font: UIFont.systemFont(ofSize: 16)) 
     return CGSize(width: view.frame.width, height: box.height + 10) 
    } 
    return CGSize(width: self.view.frame.width, height: 60) 
} 

運行此代碼時,我得到大量失算了單元尺寸: enter image description here

正如你所看到的,視圖的框架非常混亂向上。 第一行是「合雅」,第二行是「今日過得怎麼樣」,第三行是「我是訂書機,你是教科書」。有些細胞太窄,有些細胞太寬。

下面是我的自定義一些額外的代碼collectionViewCell:

override init(frame: CGRect) { 
    super.init(frame: frame) 

    setupViews() 
} 

override func layoutSubviews() { 

    chatView.frame = CGRect(x: 0, y: 0, width: chatViewWidth, height: frame.height) 
    chatTextView.frame = CGRect(x: chatView.frame.origin.x + 10, y: 0, width: chatView.frame.width - 20, height: chatView.frame.height) 
} 

func setupViews() {  

    if isTextFromCurrentUser { 
     chatTextView.frame = CGRect(x: 10, y: 0, width: frame.width - 140, height: frame.height) 
     chatTextView.backgroundColor = .white 
    } else { 
     chatTextView.frame = CGRect(x: frame.width - 150, y: 0, width: frame.width - 140, height: frame.height) 
     chatTextView.backgroundColor = .blue 
    } 

    chatTextView.font = UIFont.systemFont(ofSize: 16) 
    chatTextView.layer.cornerRadius = 9 
    chatTextView.clipsToBounds = true 
    chatTextView.autoresizingMask = UIViewAutoresizing.flexibleHeight 
    chatTextView.isScrollEnabled = false 

    contentView.addSubview(chatView) 
    contentView.addSubview(chatTextView) 
} 
+2

'widthHeight(...)'是肯定的,基本上返回** **大小的方法一個奇特的名字... :-) –

回答

1

化療,

我相信,正如它的聊天泡到你正在嘗試設置了HIGHT和聊天泡不能有任何滾動它內部確保你的textView的滾動被禁用。

其次爲聊天氣泡應該增加基於內容的高度,沒有高度限制使用CGFloat.greatestFiniteMagnitude儘可能高度,同時計算boundingRect

func widthHeight(font: UIFont) -> CGRect { 
    let constraintRect = CGSize(width: 200, height: CGFloat.greatestFiniteMagnitude) 
    let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 
    return boundingBox 
} 

最後讓你可以容納肯定沒有contentInset設置到TextView中。如果contentInset設置爲左5和右5,請確保從可容納的最大寬度中減去10(5 + 5)。

由於高度是方程設置寬度中唯一的變量,因此準確獲得正確高度是關鍵。確保你設置的行選項正確匹配你的textViews屬性。

建議:

UITableView可以利用自動高度的細胞和設置在TextView的滾動禁用使得TextView的基於文本集來計算它的大小。我的意思是textView將尊重隱含的大小。

因爲我相信你正在創建一個聊天應用程序,每個泡泡都是一個單元格,所以考慮使用UITableView的更理智的選擇,並利用自動單元格高度的好處,然後搞亂collectionView,期望你提供每個項目的大小手動。

捏建議:d

我曾親自使用邊界矩形和管理的試錯法的負荷後,計算文本的確切高度。我個人建議創建一個textView實例,將其屬性設置爲與storyboard中textView的屬性完全匹配,然後設置要顯示的文本並使用sizeThatFits獲取textView的實際大小,這更容易。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     let textView = UITextView(frame: CGRect.zero) 
     //set textView property here 
     textView.text = self.chatLog[indexPath.row].text 
     let size = textView.sizeThatFits(CGSize(width: textView.bounds.width, height: CGFloat.greatestFiniteMagnitude)) 
     return size; 
} 
+0

YESSS謝謝!最後,我改用了NSLayoutConstraints,它使事情變得更加清晰,而且無處不在的事情肯定會讓事情變得更糟。 – chemo

+0

@chemo:很高興你解決了這個問題的朋友:)快樂的編碼和隨時歡迎 –