我有一个包含五个单元格的UICollectionView。在那里,我有一个UIImageView,两个UILabel和一个UITextView。我想根据它包含的文本更改textview的高度,所以之后我可以根据UITextView的高度和它们上面的标签设置整个单元格的高度。让我演示with a screenshot。
因此,正如您所知,红色背景显示UITextView的高度不对。我像这样设置UITextView:
let commentTextView: UITextView = {
let textView = UITextView()
textView.translatesAutoresizingMaskIntoConstraints = false
textView.text = "This is just some text to act as a description"
textView.textContainerInset = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
textView.font = UIFont.systemFont(ofSize: 16.0)
textView.textColor = UIColor.darkGray
textView.isEditable = false
textView.isSelectable = false
textView.backgroundColor = UIColor.red
textView.frame.size.width = (UIScreen.main.bounds.width - 16 - 16 - 60 - 8)
let numberOfLines = (textView.contentSize.height / textView.font!.lineHeight)
var textViewHeight = (textView.font?.lineHeight)! * floor(numberOfLines)
textView.frame.size.height = textViewHeight
return textView
}()
我认为这不会造成错误的高度。我认为问题可以在我的约束中找到,它有一个高度约束(如果我删除它,UITextView就会消失)。如果我改变乘数(当前设置为0.3),我有不同的高度,但我希望这是动态的。所以在我看来,我需要在乘数中设置一个动态变量,但我不知道如何编写它。有人可以帮忙吗?这是我的约束:
// top constraints
addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .top, relatedBy: .equal, toItem: workoutLabel, attribute: .bottom, multiplier: 1, constant: 2)])
// left constraint
addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .left, relatedBy: .equal, toItem: profilePictureImageView, attribute: .right, multiplier: 1, constant: 16)])
// right constraint
addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .right, relatedBy: .equal, toItem: self.commentTextView.superview, attribute: .right, multiplier: 1, constant: -16)])
// height constraint
addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 0.3, constant: 1)])
干杯啦!
你可以考虑另一种方式关于dynamic height
的UITextView
。它是关于intrinsic content size的。您可以使用该技术实现动态高度。
最初回答here。
不要改变或给你的UITextView
任何框架。只要给它leading
,trailing
,top
和bottom
约束。然后,如果您的单元格具有自动大小,则无需为文本视图计算任何内容。
使用自动布局动态调整单元格大小时,您实际上不需要实现sizeThatFits(...)
。如果约束设置正确,那么您只需要禁用UITextView
的滚动。
yourTextView.scrollEnabled = false
选择文本视图并打开属性检查器,然后
现在,如果你面临着使你的细胞具有动态尺寸的问题,请查看this answer。
正如昨天提到的,我根据@nayem的答案调整了textview的大小 - 谢谢!
但是,我面临着使细胞高度变得动态的另一个问题。我已经研究了不同的解决方案,没有任何工作,除非我自己计算高度并将其设置为要使用的高度。这适用于Simulator中的所有设备,只是想知道这是否是正确的方法。下面的代码,约束设置在顶部,左侧和右侧。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let dummyText = "Just a long text to see what will happen to the cell. Will it adapt or not? Let's find out!"
let rectWidth = view.frame.width - 32 - 60 - 16
let rect = NSString(string: dummyText).boundingRect(with:CGSize(width: rectWidth, height: 1000), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)], context: nil)
let variableHeight = 16 + 20 + 2 + 20 + 2 + 16 + rect.height
return CGSize(width: view.frame.width, height: variableHeight)
}
这是最好的方法吗?这会在以后引起问题吗?