与大小 类 相关且在 Interface Builder 中定义的自动布局规则在 UICollectionViewCell 中被破坏

Autolayout rules relative to size classes and defined in Interface Builder are broken in UICollectionViewCell

我正在 Interface Builder 中定义自定义 UICollectionViewCell 的自动布局规则。我有两套规则:

我似乎已经正确设置了这些规则,因为当我在 Assistant Editor 中查看预览时,即使我旋转设备屏幕,单元格也会按预期呈现。但是,当我 运行 应用程序时,第二组布局规则(用于横向模式的规则)在模拟器处于横向模式时中断。控制台打印出自动调整蒙版已应用于某些视图,我需要禁用它。

这对我来说根本没有意义——我在 IB 的视图上使用了自动布局,因此应该禁用自动调整掩码。我已经尝试了以下方法,但仍然无法正常工作:

有什么想法吗?

补充:我刚刚发现——单元格本身及其 contentViewtranslatesAutoresizingMaskIntoConstraints 属性 默认为 true。不过,我真的认为我不应该将它们设置为 false。我的子视图只有自动布局规则。

UICollectionViewCell 不受设备方向的影响。它们保持它们的大小,只有显示它们的 CollectionView 会随着旋转改变大小,因此您可以在一行中放置 1 或 2 个单元格。

您必须根据设备方向实现 UICollectionViewDelegateFlowLayout 和 return 不同大小的单元格。

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath

抱歉——显然,我不小心弄乱了约束条件。似乎为 wAny hAny 设置约束也搞乱了其他大小 classes 的约束。我只是重新应用了一遍约束。

对于可能偶然发现这个问题的任何人,请注意以下几点:

  • 不必 将集合视图单元格的 translatesAutoresizingMaskIntoConstraints 及其 contentView 设置为 false。只需在单元格的子视图上应用自动布局规则。 (实际上,不要为任何未应用自动布局的视图禁用 translatesAutoresizingMaskIntoConstraints。)
  • 与@pteofil 的回答相反,UICollectionViewCells 实际上会响应大小 classes 和特征集合(你 可以 调用 self.traitCollection 从单元格内)。您可以为一种尺寸设置一组自动版式规则 class,为另一种尺寸设置另一组自动布局规则。
  • 如果您对所有可能的大小 class 都有规则,则根本不必为 wAny hAny 设置任何内容。但是,您可以在其中添加由您所定位的所有大小 classes 共享的规则,但您不必让 IB 中因约束不足而导致的红色错误消失。
  • 您仍然需要在 collectionView:layout:sizeForItemAtIndexPath: 中正确设置集合视图单元格的大小。
  • 看来要防止这种问题发生的唯一方法就是在IB中非常非常非常小心地设置约束。
  • 作为附加提示,请仔细查看控制台的输出,其中列举了无法满足的约束条件。打印您的视图的 description 以获取它们的地址并确定所指示的视图。我个人意识到当控制台打印一个我没有故意添加到受影响的视图上的约束时,玩弄 wAny hAny 弄乱了另一个尺寸 class 的规则。