计算UICollectionViewCell高度基础don UITextView属性文本

时间:2017-10-15 13:42:04

标签: ios swift uitextview

我有一个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
}

任何提示?

非常感谢。

1 个答案:

答案 0 :(得分:1)

以下可能是一个简单的ViewController的代码。

enter image description here

我只是在 UITextView 中加载一些虚拟内容。 之后messageUITextView的代表设置为此UITableViewCell

ViewController

以简单的方式实现自动调整大小有三个关键点。

1)对于UITextView“Srolling Enabled”,将其设置为“ NO ”。

2)将UITableView尺寸设置为自动并设置一些估计高度(我使用Xcode 9,但您可以使用 UITableView 属性设置) enter image description here

您还可以检查下面附带的自动布局调整大小属性。

enter image description here

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() } }