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

Ios 在UICollectionViewCell中,与大小类相关并在Interface Builder中定义的自动布局规则被破坏,ios,cocoa-touch,uicollectionview,Ios,Cocoa Touch,Uicollectionview,我正在Interface Builder中定义自定义UICollectionViewCell的自动布局规则。我有两套规则: 一个用于肖像上的iPhone(wCompact,hRegular)。在这个size类中,我的垂直滚动集合视图只显示一列单元格 另一款适用于景观和iPad上的iPhone(wRegular,hAny)。在这些大小类中,集合视图显示两列单元格 我似乎已经正确地设置了这些规则,因为当我在助手编辑器中查看预览时,单元格会按预期呈现自己,即使在我旋转设备屏幕时也是如此。但是,当我

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

  • 一个用于肖像上的iPhone(wCompact,hRegular)。在这个size类中,我的垂直滚动集合视图只显示一列单元格
  • 另一款适用于景观和iPad上的iPhone(wRegular,hAny)。在这些大小类中,集合视图显示两列单元格
我似乎已经正确地设置了这些规则,因为当我在助手编辑器中查看预览时,单元格会按预期呈现自己,即使在我旋转设备屏幕时也是如此。但是,当我运行应用程序时,当模拟器处于横向模式时,第二组布局规则(用于横向模式的规则)会中断。控制台打印出自动调整大小的遮罩已应用于某些视图,我需要禁用它

这对我来说毫无意义——我在IB中的视图上使用了Autolayout,所以应该禁用自动调整大小掩码。我尝试了以下方法,但仍然无法实现:

  • Did
    self.contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
    awakeFromNib()中。这只会使控制台安静下来,但布局仍然很混乱这也会破坏纵向模式的布局。

  • 对于我指定的两个大小类,IB不会抛出错误。然而,对于wAny hAny来说确实如此。我并没有为那个尺寸类指定足够的约束,因为我认为这是毫无意义的——我有所有可能的尺寸类组合的规则。无论如何,我尝试添加占位符约束,并在IB中选中“在构建时删除”。IB错误消失了,但根本没有修复错误

有什么想法吗


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

UICollectionViewCell不受设备方向的影响。它们保持大小,只有显示它们的CollectionView会随着旋转而更改大小,以便可以在一行中容纳1或2个单元格

您必须实现UICollectionViewDelegateFlowLayout,并根据设备方向为单元格返回不同的大小

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
对不起,很明显,我搞错了约束条件。似乎为wAny hAny设置约束也会弄乱其他尺寸类别的约束。我只是重新应用了所有的约束

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

  • 您不必为集合视图单元格及其
    内容视图
    设置
    translatesAutoresizingMaskIntoConstraints
    。只需在单元的子视图上应用自动布局规则。(实际上,不要对任何未应用自动布局的视图禁用
    TranslatesAutoResizengMaskinToConstraints
    。)
  • 与@pteofil的回答相反,
    UICollectionViewCell
    s实际上对大小类和特征集合做出响应(您可以从单元格内部调用
    self.traitCollection
    )。可以为一个尺寸类别设置一组自动布局规则,为另一个尺寸类别设置另一组自动布局规则
  • 如果您对所有可能的大小类都有规则,那么您根本不必为
    wAny-hAny
    设置任何内容。但是,您可以在那里添加由所有目标大小类共享的规则,但不必因为IB中的约束不足而出现红色错误
  • 您仍然需要在
    collectionView:layout:sizeFormiteIndeXPath:
    中正确设置集合视图单元格的大小
  • 似乎防止此类问题发生的唯一方法是非常非常小心地在IB中设置约束
  • 作为一个附加提示,请真正查看控制台的输出,其中列出了不可满足的约束。打印视图的
    说明
    ,以获取它们的地址并确定要指示哪些视图。我个人意识到,当控制台打印出一个约束时,玩弄
    wAny hAny
    会弄乱另一个大小类的规则,我并不是故意在受影响的视图上添加这个约束的