iOS 7 中自定义 TableViewCell 中的自动布局问题

Posted

技术标签:

【中文标题】iOS 7 中自定义 TableViewCell 中的自动布局问题【英文标题】:Autolayout Issues in iOS 7 in Custom TableViewCell 【发布时间】:2015-03-12 18:23:02 【问题描述】:

我在 ios 7 中遇到了 Autolayout 自定义 TableViewCell 的问题。该单元格似乎可以正确显示,但我得到了很多调试控制台输出,例如:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property
translatesAutoresizingMaskIntoConstraints) 
(
"<NSLayoutConstraint:0x7f9c1a4b8500 V:[UILabel:0x7f9c1a4b72d0]-(0)-[UILabel:0x7f9c1a4b7680]>",
"<NSLayoutConstraint:0x7f9c1a4b8550 V:[UILabel:0x7f9c1a4b7680]-(0)-[UILabel:0x7f9c1a488910]>",
"<NSLayoutConstraint:0x7f9c1a4b85c0 V:[UILabel:0x7f9c1a488910]-(NSSpace(20))-|   (Names: '|':UITableViewCellContentView:0x7f9c1a4b66d0 )>",
"<NSLayoutConstraint:0x7f9c1a4b87f0 V:|-(NSSpace(20))-[UILabel:0x7f9c1a4b6f00]   (Names: '|':UITableViewCellContentView:0x7f9c1a4b66d0 )>",
"<NSLayoutConstraint:0x7f9c1a4b8840 V:[UILabel:0x7f9c1a4b6f00]-(NSSpace(8))-[UILabel:0x7f9c1a4b72d0]>",
"<NSAutoresizingMaskLayoutConstraint:0x7f9c1a4a70e0 h=--& v=--& V:[UITableViewCellContentView:0x7f9c1a4b66d0(44)]>"
)

我只在 iOS 7 中获得此输出,并且我在我的所有自定义表格视图单元格中看到它,跨多个视图控制器。我已按照这篇文章中的所有步骤进行操作:(Using Auto Layout in UITableView for dynamic cell layouts & variable row heights)。我尝试在这些单元格中调整内容视图的 AutoresizingMask,但它并不能阻止这些错误的出现。我将非常感谢有关修复这些错误的一些建议。谢谢!

【问题讨论】:

在 iOS7 中,UITableViewCell 中的自动布局确实有些奇怪。我在这里问过这个问题:***.com/questions/28696264/…,但还没有找到解决方案。 是的,我一直在查看我能找到的所有关于这个的帖子,我想我之前看到过你的帖子。如果只是 iOS 7 的一些错误,控制台输出是否会对应用商店的审批产生影响?显然它不太理想,但 UI 的外观和行为都非常好。 仅供参考,我终于弄清楚我的问题是什么,我必须添加setContentHuggingPriority 并为水平轴添加UILayoutPriorityFittingSizeLevel 优先级。 【参考方案1】:

最后一个, "NSAutoresizingMaskLayoutConstraint:0x7f9c1a4a70e0 h=--& v=--& V:[UITableViewCellContentView:0x7f9c1a4b66d0(44)]"

可能表明在 tableviewcell 中 translatesAutoresizingMaskIntoConstraints 属性设置为 YES。如果是这种情况,请尝试将其设置为 NO 以避免您的约束与自动约束之间的冲突。

【讨论】:

这解决了问题,但现在单元格的内容不会占用单元格的整个水平空间。 我能够通过将单元格内容视图的宽度限制为单元格的宽度来解决此问题。这适用于 ios7,但会破坏 ios8 中的布局【参考方案2】:

这意味着你有冲突的约束,它选择满足一个,因为它们不能都被满足。

通常这意味着您有: 1)您知道的约束条件不会同时得到满足,例如最小尺寸或偏移量与百分比或比率相结合。在这种情况下,您需要做的就是降低要首先中断的优先级。

或者,2)重复的约束措辞不同(垂直居中,但也有尾随空格等)这个对我来说更难远程诊断,所以发布约束很重要。

如果特定约束对您来说不是那么重要(也就是说,您没有花那么长时间添加它们),那么将它们全部删除、添加建议并从那里开始工作是一个非常有效的起点。

【讨论】:

如果约束发生冲突,我不会在 iOS8 中也遇到错误吗?此外,据我所知,布局看起来完全正确,我没有看到任何 UI 元素偏离位置或尺寸不正确,因为我通常会遇到冲突。 取决于设备,因为它们可能只在某些分辨率下发生冲突(也就是您是否在两个操作系统版本上尝试了相同的设备/分辨率。)此外,根据哪些限制被打破,很多次UI 看起来不错,因为它们忽略了最不可用的约束。例如,Center Vertically but Trailing space,如果遵循垂直中心,您可能不会注意到,因为它会居中。 是的,如果它在运行 8.2 的 iPhone 4S 模拟器上运行代码,我不会遇到任何问题,但如果我在运行 7.1 的 iPhone 4s 模拟器上运行它,我会得到它。 5s也是一样。我会仔细检查以确保没有冲突。大多数控制台输出对我来说都很有意义,除了这个“[UITableViewCellContentView:0x7f9c1a4b66d0(44)”。据我了解,这意味着单元格的 ContentView 正试图垂直限制在 44 的高度,但我根据链接使用了正确的 heightForTableViewCell 代码。我通常不会在冲突中看到这一点。 顺便说一句,您在某种程度上也是正确的,在 iOS 7 上较小的屏幕尺寸上,标签的字体大小略有缩小。直到最近才注意到。

以上是关于iOS 7 中自定义 TableViewCell 中的自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章

ios 7 - 自定义 UIMenuItem 在 TableViewCell 上不起作用

iOS tableViewCell 同时设置圆角和阴影

在 iOS 7 中自定义 UISearchBar

在 ios 7.1 中自定义按钮形状

UITableViewRowAction 在 Swift 中自定义标题字体大小

iOS 7 - 故事板。为啥无法设置 tableViewCell 选择颜色