所以我正在创建一个消息类型的应用程序,它包含一些包含不同长度文本的UITextView
块,这些块位于“气泡”UIView
中。
let textView: UITextView = {
let text = UITextView()
text.text = "SAMPLE"
text.translatesAutoresizingMaskIntoConstraints = false
text.backgroundColor = .clear
text.textColor = .white
return text
}()
let bubbleView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(r: 0, g: 137, b: 247)
view.layer.cornerRadius = 14
view.layer.masksToBounds = true
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
var bubbleWidthAnchor: NSLayoutConstraint?
bubbleView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -8).isActive = true
bubbleView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
bubbleWidthAnchor = bubbleView.widthAnchor.constraint(equalToConstant: 250)
bubbleWidthAnchor?.isActive = true
bubbleView.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
textView.leftAnchor.constraint(equalTo: bubbleView.leftAnchor, constant: 8).isActive = true
textView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
textView.rightAnchor.constraint(equalTo: bubbleView.rightAnchor).isActive = true
textView.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
设置单元格的高度我正在使用自定义函数应该不能正常工作。
自定义功能:
private func estimatedFrameForText(text: String) -> CGRect {
let size = CGSize(width: 250, height: 250)
let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16)], context: nil)
}
我在sizeForItemAt
的{{1}}函数中调用了它:
UICollectionView
我遇到的一个简单问题是......它的效果不佳: Example
根据文字的不同,我知道哪里出错了,或者是一个更好的解决方案来获得我需要的单元格大小?
答案 0 :(得分:2)
事实证明,我所缺少的只是在textView
中设置文字大小。
需要放入text.font = UIFont.systemFont(ofSize: 16)
,因为获取估算大小的函数有:
attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16)
所以你必须将两者定义为相同。
答案 1 :(得分:0)
Swift 4.2更新后的答案是在uilabel的基础上处理uicollectionviewCell的高度和宽度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
let size = (self.FILTERTitles[indexPath.row] as NSString).size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14.0)])
return CGSize(width: size.width + 38.0, height: size.height + 25.0)
}