我使用以下代码让UITableViewCell具有动态高度:
tableView.estimatedRowHeight = 155
tableView.rowHeight = UITableViewAutomaticDimension
这段代码让UITextView根据内容改变它的高度。
extension NewUserTweetTableVC: UITextViewDelegate {
func textViewDidChange(textView: UITextView) {
let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
var newFrame = textView.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame
}
}
在运行时更改UITextView的文本后,UITextView的高度会发生变化,但UITableViewCell的高度不会更改。我怎么能改变呢?非常感谢帮助。
答案 0 :(得分:20)
以编程方式获取textview的高度...
http.get(...).subscribe(val => this.data = val);
或试试这个演示......
UITableView中的自定义UITextView
https://damienpontifex.com/2014/10/01/self-sizing-uitableviewcell-with-uitextview-in-ios8/
答案 1 :(得分:8)
如果您使用UITableViewAutomaticDimension
,则必须从上到下设置序列约束。没有自动布局或适当的约束UITableViewAutomaticDimension
不会起作用。因此,您可以管理此类内容:set top,bottom,leading,trailing and fixed height
约束textview
。然后选择fixed height constraint
的出口并增加它constant
而不是改变或设置textview框架,我认为每个都可以工作!
答案 2 :(得分:4)
我正在改善Lion的答案。
如果使用的是UITableViewAutomaticDimension,则必须从上到下设置串行约束。没有自动布局或适当的约束,UITableViewAutomaticDimension将无法工作。因此,您可以管理以下内容:对文本视图设置顶部,底部,行距,尾随和固定高度约束。禁用UITextview的滚动功能,即可完成。不需要固定高度限制。
答案 3 :(得分:3)
您需要禁用文本视图的滚动,以根据textView的内容大小自动调整tableViewCell的大小。
答案 4 :(得分:0)
第1步,禁用TextView滚动
第2步,添加顶部,左侧,右侧和底部约束
第3步,将Delegate设置为textView
步骤4,在UITextViewDelegate方法下面实现
- (void)textViewDidChange:(UITextView *)textView {
[UIView setAnimationsEnabled:false];
[textView sizeToFit];
[self.tableView beginUpdates];
[self.tableView endUpdates];
[UIView setAnimationsEnabled:true];}
答案 5 :(得分:0)
在Swift 4.2中更新代码
信用:http://www.swiftdevcenter.com/the-dynamic-height-of-uitextview-inside-uitableviewcell-swift/
创建一个名称为GrowingCell的自定义单元格,在该单元格中添加UITextView并为此创建一个Outlet。在ViewController类的UITableView中注册此单元格。
您的ViewController:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let nib = UINib(nibName: "GrowingCell", bundle: nil)
self.tableView.register(nib, forCellReuseIdentifier: "GrowingCell")
self.tableView.tableFooterView = UIView()
self.tableView.dataSource = self
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "GrowingCell", for: indexPath) as! GrowingCell
cell.cellDelegate = self
return cell
}
}
extension ViewController: GrowingCellProtocol {
// Update height of UITextView based on string height
func updateHeightOfRow(_ cell: GrowingCell, _ textView: UITextView) {
let size = textView.bounds.size
let newSize = tableView.sizeThatFits(CGSize(width: size.width,
height: CGFloat.greatestFiniteMagnitude))
if size.height != newSize.height {
UIView.setAnimationsEnabled(false)
tableView?.beginUpdates()
tableView?.endUpdates()
UIView.setAnimationsEnabled(true)
// Scoll up your textview if required
if let thisIndexPath = tableView.indexPath(for: cell) {
tableView.scrollToRow(at: thisIndexPath, at: .bottom, animated: false)
}
}
}
}
现在移至“自定义GrowingCell”单元格并添加以下代码:
import UIKit
protocol GrowingCellProtocol: class {
func updateHeightOfRow(_ cell: GrowingCell, _ textView: UITextView)
}
class GrowingCell: UITableViewCell {
weak var cellDelegate: GrowingCellProtocol?
@IBOutlet weak var textView: UITextView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
textView.delegate = self
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
extension GrowingCell: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
if let deletate = cellDelegate {
deletate.updateHeightOfRow(self, textView)
}
}
}
有关更多详细信息:visit this full demo
答案 6 :(得分:-1)
不确定它是否可以帮助您,但是我自定义了一个UITextView,它适合内容的高度作为其高度。
这是UITableViewCell中的TextView:
final class ContentFittingTextView: UITextView {
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
self.layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}
}
并通过您的UITableView:
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 44