を構築していChatting View Controller
ます。私のチャット バブルの制約は次のとおりです。
bubbleViewRightAnchor = bubbleView.rightAnchor.constraintEqualToAnchor(self.rightAnchor, constant: -8)
bubbleView.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true
bubbleWidthAnchor = bubbleView.widthAnchor.constraintEqualToConstant(200)
bubbleWidthAnchor?.active = true
bubbleViewRightAnchor?.active = true
bubbleView.heightAnchor.constraintEqualToAnchor(self.heightAnchor).active = true
の内部にbubbleView
は、次のようtextView
に制約されている があります。bubbleView
textView.leftAnchor.constraintEqualToAnchor(bubbleView.leftAnchor, constant: 8).active = true
textView.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true
textView.rightAnchor.constraintEqualToAnchor(bubbleView.rightAnchor).active = true
textView.heightAnchor.constraintEqualToAnchor(self.heightAnchor).active = true
チャット バブルの高さアンカーが「自己の高さアンカー」に制約されていることがわかるように、すべての制約は正常に機能しますcollection View cell
。したがって、セルの高さに関係なく、バブルも同様に高さを持ちます。吹き出しの内側にはtextView
、ユーザーが送信したすべてのテキストが含まれています。別のでは、内のテキストの量に基づいてView Controller
の高さと幅を変更する次のコードは次のようになります。collection view cell
textview
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
var height: CGFloat = 80
if let text = messages[indexPath.item].text {
height = estimateFrameForText(text).height + 20
}
let width = UIScreen.mainScreen().bounds.width
return CGSize(width: width, height: height)
}
private func estimateFrameForText(text: String) -> CGRect {
let size = CGSize(width: 200, height: 1000)
let options = NSStringDrawingOptions.UsesFontLeading.union(.UsesLineFragmentOrigin)
return NSString(string: text).boundingRectWithSize(size, options: options, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16)], context: nil)
}
この関数estimateframefortext
は、テキストに基づいてセルのフレームを推定します (どういうわけか、それがどのように行われるのかわかりません)。600 文字以下のメッセージでは問題なく動作しますが、それ以上の文字を書くと、セルに 20 ~ 30 の高さが追加され、セルbubbleView
に制約されているものも高さを採用し、クリア スペースが表示されるようになります。テキストの下。テキストの量に基づいてセルの高さを推定するためのより正確な関数があるかどうか疑問に思っていました。