我有一个UICollectionViewCell
,其UITextView
作为其子视图,固定在单元格的边界上。
我在这里尝试实现的目标是基于UITextView attributedString
,计算UITextView
应该具有的高度,不能滚动并将该大小应用于单元格&#39 ;高度。
这里的问题是NSAttributedString
可能有不同的字体大小,它也可能有一些图像,这会增加它的大小。
如何根据内容计算尺寸,内容可以有多种内部形式(尺寸,换行符,图像)?
我用来应用以下功能,但在这种情况下它不起作用,因为内部内容,如字体大小可能会延迟,它不是常数:
private func estimatedHeightForText(_ text: String) -> CGFloat {
let approximateWidthOfBioTextView = view.frame.width - 24 // paddings
let size = CGSize(width: approximateWidthOfBioTextView, height: 1000) // height of 1000 is an arbitrary value
let attributes = [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 12)] // attributes of the text
// gets the estimation height based on Text
let estimatedFrame = NSString(string: text).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil)
return estimatedFrame.height
}
任何提示?
非常感谢。
答案 0 :(得分:1)
以下可能是一个简单的ViewController的代码。
我只是在 UITextView 中加载一些虚拟内容。
之后message
中UITextView
的代表设置为此UITableViewCell
。
ViewController
以简单的方式实现自动调整大小有三个关键点。
1)对于UITextView“Srolling Enabled”,将其设置为“ NO ”。
2)将UITableView尺寸设置为自动并设置一些估计高度(我使用Xcode 9,但您可以使用 UITableView 属性设置)
您还可以检查下面附带的自动布局调整大小属性。
3)现在,当您编辑textView时,您可以让委托更新UITableView或在 beginUpdates 和 endUpdates 中重新加载特定的indexPath。 class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UITextViewDelegate {
@IBOutlet var tableView:UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellId = "textCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellId)!
return cell
}
func textViewDidChange(_ textView: UITextView) {
tableView.beginUpdates()
tableView.endUpdates()
}
}