iOS表格视图单元格自动高度与自定义子视图

时间:2017-09-16 00:08:22

标签: ios uitableview autolayout

我需要非常简单的事情 - 表格单元格会自动检测自己的高度。有很多例子,基本上说"在你的桌子上设置几个标志和值,并在你的单元格中使用autolayout"。我的情况有点特别 - 我从单独的XIB文件加载单元格的内容,这是一个简单的UIView。当我在界面构建器中创建该XIB文件时,第一个问题就出现了 - 我不知道如何使它达到"计算"根据我指定的约束。我总是得到IB错误,除非我切换到" Freeform"并将视图调整到与我的约束匹配的高度。如果我不这样做,我将收到以下错误:

enter image description here

在上面的示例中,我只需要一个视图,其高度为32(图像高度)+ 2 * 16(来自父级' s顶部和底部的图像的垂直距离约束)加上边距。调整IB中自由格式视图的大小直到错误消失对我来说似乎是一个肮脏的黑客,它实际上不是自动布局。下一步,我定义了一个单元类,在这里放置了这个xib视图,就像这样的(对不起objc代码,几乎完成了将项目移植到swift)

/etc/gitlab-runner/config.toml

正如你可能猜到的那样,当我运行它时,单元格高度是大的自由形式,就像在内容XIB的IB中一样,所以没有自动布局。看起来自由形式的高度甚至被添加为另一个约束,并且存在约束冲突,导致其中一些在运行时被破坏。

让我知道如何解决这个问题,轻松为具有自动高度的单元格创建内容视图,并将其嵌入到单元格中以使- (void)awakeFromNib { [super awakeFromNib]; [[NSBundle mainBundle] loadNibNamed:@"CellContent" owner:self options:nil]; // self.content is an outlet which gets the root of the XIB on load [self.contentView addSubview:self.content]; self.contentView.translatesAutoresizingMaskIntoConstraints = NO; [self.contentView.leftAnchor constraintEqualToAnchor:self.content.leftAnchor].active = YES; [self.contentView.rightAnchor constraintEqualToAnchor:self.content.rightAnchor].active = YES; [self.contentView.topAnchor constraintEqualToAnchor:self.content.topAnchor].active = YES; [self.contentView.bottomAnchor constraintEqualToAnchor:self.content.bottomAnchor].active = YES; } 魔法受益?

3 个答案:

答案 0 :(得分:0)

也许您忘记设置标签的内容拥抱优先级内容压缩阻止优先级enter image description here

答案 1 :(得分:0)

  1. 确保0具有多行属性。因此,请Line PropertyAttribute Inspector设置UILabel
  2. 确保Auto-Layout Left-Right-Top-Bottom-(CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 正确相对。
  3. 应用这些委托函数:

    {{1}}

答案 2 :(得分:0)

我发现了我的问题。实际上,由于自动调整,存在与添加约束的冲突。所以我改变了这一行(来自上面的问题):

self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

为:

self.content.translatesAutoresizingMaskIntoConstraints = NO;

愚蠢的错误,添加后应为视图禁用translatesAutoresizingMaskIntoConstraints标志,而不是父视图,因为我错误地做了。之后,细胞自动高度检测的魔力开始像魅力一样发挥作用。