0

を構築してい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 celltextview

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に制約されているものも高さを採用し、クリア スペースが表示されるようになります。テキストの下。テキストの量に基づいてセルの高さを推定するためのより正確な関数があるかどうか疑問に思っていました。

ここに画像の説明を入力

4

1 に答える 1

0

thenを使用している場合は、次のUITextView方法を使用できます。

import UIKit
import XCPlayground

let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 500))
view.backgroundColor = UIColor.whiteColor()
XCPlaygroundPage.currentPage.liveView = view

let text = "The function estimateframefortext estimates the frame of the cell based on the text (somehow, no idea how it does it). It works fine for messages under 600 characters or so, however, if you write more characters it adds an extra 20-30 of height to the cell, the bubbleView being constrained to the cell will also adopt the height, where you can now see clear space under the text. I was wondering if there were more precise functions to estimate what the height of a cell should be. \n!!!!!The function estimateframefortext estimates the frame oheightTextThe function estimateframefortext estimates the frame of the cell based on the text (somehow, no idea how it does it). It works fine for messages under 600 characters or so, however, if you write more characters it adds an extra 20-30 of height to the cell, the bubbleView being constrained to the cell will also adopt the height, where you can now see clear space under the text. I was wondering if there were more precise functions to estimate what the height of a cell should be "

let label = UITextView()
view.addSubview(label)
label.text = text

let size = label.sizeThatFits(CGSize(width: view.bounds.width, height: 0))
let heightText = size.height
debugPrint(label.contentSize)
label.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: heightText)
label.layer.borderWidth = 1
label.layer.borderColor = UIColor.redColor().CGColor

また:

let label = UITextView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 0))
view.addSubview(label)
label.text = text
debugPrint(label.contentSize)
label.frame.size = label.contentSize
label.layer.borderWidth = 1
label.layer.borderColor = UIColor.redColor().CGColor

説明:

UITextViewコンテンツ[この場合はテキスト]を配置すると、スクロール可能な動作を実装します。textViewはプロトコルUIScrollViewに準拠します。そのために、コンテンツビューのサイズを返すcontentSizeを使用できます。

于 2016-08-07T23:55:49.157 に答える