我正在开发一个处理纵向和横向方向的 iPad 应用程序。我有一个表格视图,显示具有复杂(?)布局的单元格,并且可以有不同的高度。
这是纵向应该是什么样子的屏幕截图(= 768 pts witdh,这应该导致 435 pts 高度)
这是横屏时应该是什么样子的屏幕截图(= 1024 pts 宽度,这应该导致 526 pts 高度)
为了简化一点布局,我们将只保留第一张图片。
布局
我有 1 张图像应该在设备旋转时增加/减少时保持其比例:纵向 = 256 宽度 * 342 横向高度 = 341,333 宽度 * 456 高度我有黄色视图(应该有 8 pts 的边距以及每个方向 16 pts 的填充)包含标题(蓝色)和潜在的多行文本内容(粉红色)。注意: - 粉红色的标签可能完全是空的。- 黄色视图将被纹理化,这就是为什么需要它,它不仅仅是解决某些问题的额外视图。
内容视图(UITableViewCell 的子级)约束
V:|-(0)-[UIImageView] (Names: '|':UITableViewCellContentView)>", // Top margin (0 pts) of the image
H:|-(0)-[UIImageView] (Names: '|':UITableViewCellContentView)>", // Left margin (0 pts) of the image
V:[UIImageView]-(8)-[UIView]>", // Vertical space (8 pts) between the image and the yellow view (i.e. top margin of the yellow view)
H:|-(8)-[UIView] (Names: '|':UITableViewCellContentView)>", // Left margin (8 pts) of the yellow view
H:[UIView]-(8)-| (Names: '|':UITableViewCellContentView)>", // Right margin (8 pts) of the yellow view
V:[UIView]-(8)-| (Names: '|':UITableViewCellContentView)>", // Bottom margin (8 pts) of the yellow view
黄色视图约束
V:|-(16)-[UILabel:Blue] (Names: '|':Yellow View )>", // Top margin (16 pts) of the blue label (i.e. top padding of the yellow view)
H:|-(16)-[UILabel:Blue] (Names: '|':Yellow View )>", // Left margin (16 pts) of the blue label
V:[UILabel:Blue]-(>=16)-| (Names: '|':Yellow View )>", // Bottom margin (>= 16 pts) of the blue label
H:[UILabel:Blue]-(NSSpace(8))-[UILabel:Pink]>", // Horizontal space between blue and pink labels
V:[UILabel:Pink]-(16)-| (Names: '|':Yellow View )>", // Top margin (16 pts) of the pink label
H:[UILabel:Pink]-(16)-| (Names: '|':Yellow View )>", // Right margin (16 pts) of the pink label
V:|-(16)-[UILabel:Pink] (Names: '|':Yellow View )>", // Bottom margin (16 pts) of the pink label
约束说明
- 在 Interface Builder 中,我为图像设置了 256 宽 * 342 高的占位符固有尺寸(稍后我们将看到,我根据设备方向在代码中动态设置实际尺寸约束)
- 蓝色标签的水平内容压缩优先级为 751
- 图像的垂直拥抱优先级为 1
- 黄色视图和粉红色标签的垂直拥抱优先级为 1000
界面生成器测试
如果我增加单元格高度,图像会变形并且它的高度会增加,而底部的黄色视图棒会变形。所以一切都很好(因为我们无法在 IB 中设置比例约束来模拟图像的保持率增长)。
代码
结果
如果我以纵向启动应用程序,则单元格是完美的。粉红色标签显示在 2 行上,每个尺寸和间距都得到充分尊重/计算!如果然后我旋转到横向,图像不会增长,而是黄色视图和粉红色标签正在增长......这是一个截图:
现在,如果我以横向方式启动应用程序,单元格也很完美。图像尺寸合适(351 pts 宽度(四舍五入值)* 456 pts 高度)等......如果我旋转到纵向它会使应用程序崩溃......具有以下输出:
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:0xa3d9dd0 V:|-(0)-[UIImageView] (Names: '|':UITableViewCellContentView )>",
"<NSLayoutConstraint:0xa3d9e00 V:[UIView]-(8)-| (Names: '|':UITableViewCellContentView )>",
"<NSLayoutConstraint:0xa3d9e60 V:[UIImageView]-(8)-[UIView]>",
"<NSLayoutConstraint:0xa3dd9b0 V:[UIImageView(456)]>",
"<NSAutoresizingMaskLayoutConstraint:0xa3de670 h=--& v=--& V:[UITableViewCellContentView(431)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xa3dd9b0 V:[UIImageView(456)]>
注:UIView 为黄色视图
非常感谢您的帮助(或至少阅读;-)
PS:我昨天在开发论坛上发布了同样的问题,并将在这里发布任何进展。 开发论坛讨论链接