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 打破约束?的主要内容,如果未能解决你的问题,请参考以下文章