Я строю Chatting View Controller
. ограничения моего пузыря чата являются следующими:bubble in Collection View не растет до соответствующей высоты
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
, будучи привязанным к ячейке, также будет принимать высоту, где теперь вы можете видеть четкие пространство под текстом. Мне было интересно, есть ли более точные функции для оценки того, какая высота ячейки должна основываться на том, сколько текста есть.