0

我正在开发一个处理纵向和横向方向的 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 中设置比例约束来模拟图像的保持率增长)。

代码

可在 GitHub 上获得

结果

如果我以纵向启动应用程序,则单元格是完美的。粉红色标签显示在 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:我昨天在开发论坛上发布了同样的问题,并将在这里发布任何进展。 开发论坛讨论链接

4

1 回答 1

1

我下载了您的示例项目并运行了它。您似乎在代码中遇到了一些问题,但到目前为止,最明显的问题是reloadData当发生自动旋转时您没有调用表格视图——这是让表格视图重新计算单元格高度所必需的(并且根据更改重新布局每个可见单元格)。

将以下方法添加到您的ARJProcedureListViewController.m文件中:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [self.tableView reloadData];
}

我仍然看到约束冲突记录到控制台,这意味着您的约束中至少有一个是错误的(您可能过度约束了某些视图)。

于 2013-10-25T18:06:29.543 回答