UITableViewAutomaticDimension 打破约束?

Posted

技术标签:

【中文标题】UITableViewAutomaticDimension 打破约束?【英文标题】:UITableViewAutomaticDimension breaking constraints? 【发布时间】:2014-11-29 16:34:23 【问题描述】:

我正在尝试使用UITableViewAutomaticDimension,但我无法在不引起NSLayoutAutomaticSizeConstraint... 问题的情况下将单元格设置为全宽和正确高度。如果我在单元格上关闭自动大小限制,则它不是全宽。

我有两个按钮,内容视图具有水平和垂直约束。它们之间有一个垂直间距限制,每个按钮都有一个高度限制。

如果我关闭AutoResizingMask,我会得到一个非全宽单元格。如果我让它打开,我会违反布局约束,但会正确呈现。

如何获得我正在寻找的行为?

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]>",
    "<NSLayoutConstraint:0x7f856b173dd0 UIButton:0x7f856b16a510'+(null)'.top == UITableViewCellContentView:0x7f856b16bfa0.topMargin>",
    "<NSLayoutConstraint:0x7f856b173e70 UITableViewCellContentView:0x7f856b16bfa0.bottomMargin == UITextField:0x7f856b16c4f0.bottom>",
    "<NSLayoutConstraint:0x7f856b174520 V:[UIButton:0x7f856b16a510'+(null)']-(8)-[UITextField:0x7f856b16c4f0]>",
    "<NSLayoutConstraint:0x7f856b182a10 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f856b16bfa0(66)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]>

实际上看起来宽度是由

设置的
- (CGSize)intrinsicContentSize 
    return CGSizeMake(320, 66);

如果我不设置内在内容大小,我不会得到任何宽度或高度。

【问题讨论】:

1) 您是否在代码中创建约束和视图? 2) 在您的视图导航器中,您是否收到黄色或红色错误?3) 您在视图中还有什么? 你遇到了哪些布局约束违规? @Spectravideo328 IB中没有黄色或红色错误,所有约束都在IB中。 @Lefteris 我添加了约束错误消息。我正在使用 UITextField,就好像它是一个按钮一样。 【参考方案1】:

编辑: 它绝对是两个高度限制。尝试删除一个,或降低优先级。

【讨论】:

我将两个高度限制都设置为 999 而不是 1000。没有自动布局例外。我不明白,但它对我有用。 根据您当前的限制,您基本上拥有一个固定高度的单元格。这样想,如果三个垂直间距约束的值各为 5,而按钮高度的值各为 10,则高度固定为 35(5 + 10 + 5 +10 +5)。跨度> 当然,这就是我的意图。但是我有几个不同高度的单元格,如果没有自动尺寸,这将意味着一堆代码。底部垫片可能是“至少”,但这是我想要的唯一真正的摆动空间。 我不确定这一点,但我相信 TableViewCell 默认具有灵活的大小。我不相信您可以在 ios 8 的动态单元格上明确设置 IB 中的高度。如果您想要明确的高度,请使用 heightForRowAtIndex 并检查单元格标识符以设置不同的高度。检查单元格标识符时,不要调用 cellForRowAtIndex,而是检查您的数组或数据源。【参考方案2】:

AutoresizingMask on = 允许此视图的父级设置适当的掩码。

AutoresizingMask off = 不允许此视图的父级设置适当的掩码。我想自己做。

如果您在 IB 中创建视图,它们的 autoresizingMasks 默认设置为 No。

如果您在代码中创建视图,它们的 autoresizingMasks 默认设置为 Yes。

当您关闭 AutoresizingMask 时,您得到一个非全宽单元格(或实际上有任何行为变化)这一事实意味着单元格或表的父级(在视图层次结构中)可能正在接管并设置约束(即不是你想要的)。

现在我认为你得到这个非全宽单元格的原因是,当你在视图元素之间拖动以设置约束时,IB 中有一个令人讨厌的默认值,而不是将约束绑定到顶部、底部等。 .; IB 将其绑定到边距(不同)。

所以你需要从“文档大纲”中选择你的约束:

然后一一选择与边界相关的约束:

并确保未勾选“相对于边距”。

如果您使用 IB 右下角的摘要约束选项卡(左起第二个),您可以在创建约束时取消选择“约束到边距”:

【讨论】:

@StefanKendall 如上所述,您的顶部、右侧和左侧约束是否设置为 ContentView 而不是 contentView 的边缘?【参考方案3】:

我遇到了类似的问题:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

它向我扔了一个关于“无法满足约束”的日志,但没有任何约束误导,所以我添加了估计的HeightForRowAtIndexPath:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

它修复了

【讨论】:

以上是关于UITableViewAutomaticDimension 打破约束?的主要内容,如果未能解决你的问题,请参考以下文章