2017-08-30 3 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

あなたが見ることができるように、ビューのフレームは非常に混乱していますアップ。 最初の行は "Heya"、2行目は "これまでの生活"、3行目は "私はステープラーです、あなたは教科書です"一部の細胞は狭すぎ、一部の細胞は広すぎます。

ここに私のカスタム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

各論として、ケモ、

は、その内部では、textViewのスクロールが無効になっていることを確認します。

チャットバブルのような第2の内容に基づいて、その高さを大きくする必要がありますし、

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設定されていないことを確認しているときに対応できる可能性の高さなど全く高さ制限使用 CGFloat.greatestFiniteMagnitudeはありませんtextView。 contentInsetを左5と右5に設定した場合、最大幅から10(5 + 5)を引いてください。

ここでは、高さは方程式を設定する際の唯一の変数です。正確な高さを得るための鍵です。あなたはラインのオプションに一致するur textViewsプロパティが一致していることを確認してください。

提案:

UITableViewは、セルの自動高さを利用すると、スクロールのTextViewに無効に設定すると、テキストのセットに基づいて、そのサイズを計算するのTextViewを作ることができます。私はtextViewは暗黙的なサイズを尊重することを意味します。

各バブルがセルであるチャットアプリを作成していると思うので、UITableViewを使用して自動セルの高さを利用して、各アイテムのサイズを提供することを期待するcollectionViewを使いこなすという、手動でアドバイスの

ピンチ:D

私は個人的に矩形の境界を使用し、試行錯誤方式の負荷の後にテキストの正確な高さを計算するために管理しています。私は個人的には、あなたのストーリーボードにあるtextViewのプロパティと正確に一致するプロパティを設定して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の使用に変わりました。そして、uiedgeinsetsは間違いなく物事を取り締まっていました。 – chemo

+0

@chemo:あなたは問題バディを解決してうれしいです:)ハッピーコーディングといつでも歓迎 –

関連する問題