当我使用自动布局和 xib 制作 uitableviewcell 时,为啥要将 translatesAutoresizingMaskIntoConstraints 设置为 YES?

Posted

技术标签:

【中文标题】当我使用自动布局和 xib 制作 uitableviewcell 时,为啥要将 translatesAutoresizingMaskIntoConstraints 设置为 YES?【英文标题】:When I use auto layout & xib to make a uitableviewcell , why should I set the translatesAutoresizingMaskIntoConstraints to YES?当我使用自动布局和 xib 制作 uitableviewcell 时,为什么要将 translatesAutoresizingMaskIntoConstraints 设置为 YES? 【发布时间】:2014-11-25 05:27:56 【问题描述】:

在我看来,如果

translatesAutoresizingMaskIntoConstraints = YES

布局系统会根据当前的xib文件大小(如宽度和高度)生成一些隐式约束,这些约束不适用于动态高度的单元格(例如单元格中有多行标签)。

但是在我的项目中,如果我在awakeFromXib中设置translatesAutoresizingMaskIntoConstraints = NO,会出现很多布局问题,如果我将translatesAutoresizingMaskIntoConstraints设置为默认(是)。一切正常。两个宽度都将更改为 tableview 的宽度,高度将根据多行标签进行调整。我对 translatesAutoresizingMaskIntoConstraints 的理解有误吗?

【问题讨论】:

【参考方案1】:

ios do its internal stuff 并尝试将更改限制在您自己的视图中,即contentView 的子视图。

【讨论】:

其实我前几天在使用自定义视图作为tableHeaderView的时候遇到了一个问题。我发现如果我没有将 translatesAutoresizingMaskIntoConstraints 设置为 NO ,那么自定义视图的高度将始终是 xib 文件的高度。仅当我将其设置为 NO 时,自定义视图的高度才会动态调整。所以我想知道为什么我必须在自定义视图中将 translatesAutoresizingMaskIntoConstraints 设置为 NO 并在 tableview 单元格中将其设置为 YES? 答案在链接的文章中:“您不应该调用 setTranslatesAutoresizingMaskIntoConstraints: 的主要情况是您不是指定视图与其容器的关系的人。例如,NSTableRowView 实例“在当前版本中对您有用的任何“解决方案”都可能在任何时候停止工作,您不会受到任何责备。 但是在一些像 > 这样的书籍中是这样说的,并且在我之前的问题中,你无法修复它,直到你手动将此标志设置为 NO ---从书中引用:“这是一个明智的规则,但这意味着如果你打算将任何明确的约束应用到这样的视图,你可能需要记住通过将视图的 translatesAutoresizingMaskIntoConstraints 属性设置为 NO 来关闭这种自动行为. 如果你不这样做,你最终会得到影响这个视图的隐式约束和显式约束,而且你不太可能想要那样" 所以我想深入了解整个系统,并了解自动布局调整所有 tableView 组件的大小和位置:) 我相信在这种情况下使用自动布局的正确方法是尝试为自己的约束做不同优先级的事情,更重要的是有必要研究系统生成的约束以了解什么你正在处理。不幸的是,我不能提供任何特别的建议作为有保证的解决方案。【参考方案2】:

如果您在 XIB/Storyboard 中正确设置了自动布局约束,那么系统本身将为您处理布局大小。这就是您设置该布尔值的原因。如果您没有设置约束并且没有设置 bool,那么您负责视图大小和必须在代码中处理的位置。随着新的外形尺寸的引入,它最好使用正确的布局并让自动布局系统为您处理框架。

【讨论】:

其实我前两天在使用自定义视图作为tableHeaderView的时候遇到了一个问题。我发现如果我没有将 translatesAutoresizingMaskIntoConstraints 设置为 NO ,那么自定义视图的高度将始终是 xib 文件的高度。只有当我将其设置为 NO 时,自定义视图的高度才会动态调整。所以我想知道为什么我必须在自定义视图中将 translatesAutoresizingMaskIntoConstraints 设置为 NO 并在 tableview 单元格中将其设置为 YES?【参考方案3】:

从苹果开发者文件中,我得到了一条规则,也许它对我们来说已经用完了

对于知道自动布局的视图,在大多数情况下,您希望 translatesAutoresizingMaskIntoConstraints 设置为 NO。原因是通过翻译自动调整掩码生成的约束已经足以完全指定视图的框架给定其父视图的框架,这通常太多了。例如,这种翻译会阻止按钮在其标题更改时自动采用其最佳宽度。

您不应该调用 setTranslatesAutoresizingMaskIntoConstraints: 的主要情况是当您不是指定视图与其容器的关系的人时。例如,NSTableView 放置一个 NSTableRowView 实例。它可能通过允许将自动调整大小的掩码转换为约束来做到这一点,也可能不会。这是一个私有的实现细节。其他不应调用 setTranslatesAutoresizingMaskIntoConstraints 的视图:包括 NSTableCellView 对象、NSSplitView 的子视图、NSTabViewItem 的视图或 NSPopover、NSWindow 或 NSBox 对象的内容视图。对于熟悉经典 Cocoa 布局的人:如果您不会在经典样式的视图上调用 setAutoresizingMask:,则不应在 Auto Layout 下调用 setTranslatesAutoresizingMaskIntoConstraints:。

【讨论】:

以上是关于当我使用自动布局和 xib 制作 uitableviewcell 时,为啥要将 translatesAutoresizingMaskIntoConstraints 设置为 YES?的主要内容,如果未能解决你的问题,请参考以下文章

从 Xib 加载视图在自动布局后调整框架子视图的大小

使用自动布局调整 xib 元素的宽度

更新为 iPhone 5 制作的 XIB 以与 iPhone 6 和 iPhone 6 Plus 一起使用

iOS 8.0.2 和 iPhone plus 当我在 XIB 中设置 UIButton backgroundImage 时,UIButton 变得更大,尽管这个按钮具有高度和重量的自动布局

以编程方式在 xib 上使用自动布局创建的两个文本字段之间添加 uiview

iPhone 和 iPad 的动态 xib 布局