iOS 8为tableViews引入了一种方法,可以根据内容自动调整单元格的高度(通过AutoLayout)。
// in viewDidLoad:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0
我已经使用标签,图像等了。
但是,一旦单元格的文本视图发生变化,我无法找到表格视图单元格自动增长的方法吗?
有关设置的更多信息: 单元格内的UITextView对表格视图单元格的contentView具有水平和垂直约束。我还禁用了文本视图的滚动。
我还尝试手动更改单元格的高度约束,但单元格也不会采用这些更改。
答案 0 :(得分:23)
如果一切设置正确(自动布局限制),您不必自己计算。
您只需要在textViewDidChange
来电tableView.beginUpdates()
和tableView.endUpdates()
上停用UITextView的滚动启用属性。
有关详细说明,请查看post I wrote,其中还包含一个工作示例项目。
答案 1 :(得分:4)
使用textViewDidBeginEditing:
UITextViewDelegate
方法重新加载单元格
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
显然,您应该将索引路径更改为您的单元格的正确索引路径。这将使单元格更新其约束并自行调整大小。
答案 2 :(得分:2)
必须通知tableView
textView
已更改。其他帖子通常会回答“静态” textView
问题。但是,如果要在表中键入内容,则单元格需要随着textView
的增长而增长。 textView
通过禁用滚动来增长。通过将textView
的顶部和底部约束设置为该单元格contentView
的顶部和底部约束,该单元会增长。表格加载后,此功能将工作一次。但是,要告诉tableView
实时增长,您必须在textView
的{{1}}委托调用中进行
didChange
这将按预期工作。键入时,该单元格将增长,并且不会出现“反弹”。
答案 3 :(得分:1)
Swift 4的解决方案
func textViewDidChange(_ textView: UITextView) {
let fixedWidth = textView.frame.size.width
let oldSize = textView.frame.size
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)))
if oldSize.height != newSize.height {
UIView.setAnimationsEnabled(false)
var newFrame = textView.frame
newFrame.size = CGSize(width: fmax(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame
self.tableView.beginUpdates()
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
}
}
答案 4 :(得分:0)
这是我使用的功能,它解决了每次按键后表格视图反弹的问题。
- (void)textViewDidChange:(UITextView *)textView {
CGFloat fixedWidth = textView.frame.size.width;
CGSize oldSize = textView.frame.size;
CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
// Resize cell only when cell's size changes, to prevent bouncing back and forth.
if (oldSize.height != newSize.height) {
[UIView setAnimationsEnabled:NO];
CGRect newFrame = textView.frame;
newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
textView.frame = newFrame;
[self.tableView beginUpdates];
[self.tableView endUpdates];
[UIView setAnimationsEnabled:YES];
}
}
答案 5 :(得分:0)
您应该禁用UITextView中的滚动