UITableViewCell内视图的自动输出宽度比

时间:2014-09-16 15:10:27

标签: ios autolayout

四个UIViews(v1,v2,v3,v4)位于UITableViewCell内。 细胞有限制: v1.width / v2.width,v1.width / v3.width,v1.width / v4.width 和 视图与超视图之间的水平距离(x-v1-x-v2-x-v3-x-v4-x)。

视图宽度必须直接从单元格内容视图宽度计算。它们在iOS8中正确计算,在iOS7中随机计算。如果视图也在UIView中(而不是UITableViewCell),则会发生这种情况。为什么会发生这种情况以及如何在这种情况下支持iOS7?

更新 内容拥抱所有视图的优先级 - 250.内容压缩阻力所有视图的优先级 - 750.我的所有自定义约束优先级 - 1000。 内部视图的水平约束:

ios7:

    "<NSLayoutConstraint:0x7fc84bf6bf30 H:|-(0)-[UIView:0x7fc84bf6b990]   (Names: '|':UITableViewCellContentView:0x7fc84bf6b8d0 )>",
"<NSLayoutConstraint:0x7fc84bf6bee0 UIView:0x7fc84bf6b990.width == 1.2*UIView:0x7fc84bf6baf0.width>",
"<NSLayoutConstraint:0x7fc84bf6aed0 UIView:0x7fc84bf6b990.width == 1.4*UIView:0x7fc84bf6bc10.width>",
"<NSLayoutConstraint:0x7fc84bf6bf80 UIView:0x7fc84bf6b990.width == 1.8*UIView:0x7fc84bf6bd30.width>",
"<NSLayoutConstraint:0x7fc84bf6bfd0 H:[UIView:0x7fc84bf6b990]-(8)-[UIView:0x7fc84bf6baf0]>",
"<NSLayoutConstraint:0x7fc84bf6c020 H:[UIView:0x7fc84bf6baf0]-(5)-[UIView:0x7fc84bf6bc10]>",
"<NSLayoutConstraint:0x7fc84bf6c070 H:[UIView:0x7fc84bf6bd30]-(12)-|   (Names: '|':UITableViewCellContentView:0x7fc84bf6b8d0 )>",
"<NSLayoutConstraint:0x7fc84bf6c0c0 H:[UIView:0x7fc84bf6bc10]-(5)-[UIView:0x7fc84bf6bd30]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fc84bf14260 h=--& v=--& H:[UITableViewCellContentView:0x7fc84bf6b8d0(320)]>"

iOS8上:

    "<NSLayoutConstraint:0x78ed1b70 H:|-(0)-[UIView:0x78ed24f0]   (Names: '|':UITableViewCellContentView:0x78ed1dd0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x78ecfa70 h=--& v=--& 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UITableViewCellContentView:0x78ed1dd0]   (Names: '|':TableViewCell:0x78ed2350 )>",
"<NSLayoutConstraint:0x78ed2730 UIView:0x78ed24f0.width == 1.2*UIView:0x78ed2560.width>",
"<NSLayoutConstraint:0x78ed1cb0 UIView:0x78ed24f0.width == 1.4*UIView:0x78ed25d0.width>",
"<NSLayoutConstraint:0x78ed2760 UIView:0x78ed24f0.width == 1.8*UIView:0x78ed2640.width>",
"<NSLayoutConstraint:0x78ed2790 H:[UIView:0x78ed24f0]-(8)-[UIView:0x78ed2560]>",
"<NSLayoutConstraint:0x78ed27c0 H:[UIView:0x78ed2560]-(5)-[UIView:0x78ed25d0]>",
"<NSLayoutConstraint:0x78ed27f0 H:[UIView:0x78ed2640]-(12)-|   (Names: '|':UITableViewCellContentView:0x78ed1dd0 )>",
"<NSLayoutConstraint:0x78ed2820 H:[UIView:0x78ed25d0]-(5)-[UIView:0x78ed2640]>",
"<NSLayoutConstraint:0x78ebb880 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x78ed1dd0(320)]>"

ios8

ios7

2 个答案:

答案 0 :(得分:1)

根据您目前发布的信息,这看起来像是在iOS 8中修复的iOS 7布局引擎中的错误。

我基于这样的猜测:你的约束在iOS 7和iOS 8之间是相同的,并且是明确的,并且在iOS 8中正常工作。

具体来说,如果我们调用灰色视图w的宽度,则通过求解<{p}}中的w来确定水平布局

0 + 8 + 5 + 5 + 12 + w + w/1.2 + w/1.4 + w/1.8 = 0.

Plugging this into Wolfram Alpha提供w = 36540/391 ≈ 93.453,这是一种独特的解决方案。理想情况下,视图的宽度约为93.453,78.877,66.752和51.918。但是,布局引擎会将这些内容舍入到像素边界。在我的测试中,视图最终的宽度为93.5,79.0,66.5和52.0。

您可以将部署目标设置为iOS 8.0,也可以手动布局这些子视图。我不希望Apple发布一个新的iOS 7版本来解决这个问题。

答案 1 :(得分:0)

确保使用边界作为矩形而不是框架进行计算。 编辑: 现在我看到你正在使用autolayout。你能发布你的拥抱和抗压力优先事项吗?