iOS 8使用UITextView自动调整UITableViewCell大小

时间:2014-09-11 15:14:05

标签: uitableview autolayout ios8

iOS 8为tableViews引入了一种方法,可以根据内容自动调整单元格的高度(通过AutoLayout)。

// in viewDidLoad:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0

我已经使用标签,图像等了。

但是,一旦单元格的文本视图发生变化,我无法找到表格视图单元格自动增长的方法吗?

有关设置的更多信息: 单元格内的UITextView对表格视图单元格的contentView具有水平和垂直约束。我还禁用了文本视图的滚动。

我还尝试手动更改单元格的高度约束,但单元格也不会采用这些更改。

6 个答案:

答案 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中的滚动