在UICollectionViewCell

时间:2015-04-28 07:03:14

标签: ios cocoa-touch uicollectionview

我在Interface Builder中定义了自定义UICollectionViewCell的Autolayout规则。我有两套规则:

  • 一个用于肖像上的iPhone(wCompact,hRegular)。在此大小类中,我的垂直滚动集合视图仅显示一列单元格。
  • 另一款适用于风景和iPad的iPhone(wRegular,hAny)。在这些大小类中,集合视图显示两列单元格。

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

对我来说根本没有意义 - 我在IB中的视图上使用了Autolayout,因此应该禁用自动调整掩码。我尝试过以下操作,但仍然无法使用此功能:

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

  • 对于我指定的两个大小类,IB不会抛出任何错误。但是,对于wAny hAny来说确实如此。我没有为该大小类指定足够的约束,因为我认为它没有意义 - 我有所有大小类的可能组合的规则。无论如何,我尝试添加占位符约束并检查"在构建时删除"在IB。 IB错误消失但它根本没有解决错误。

有什么想法吗?

添加:我刚发现 - 默认情况下,单元格本身及其contentView的{​​{1}}属性为translatesAutoresizingMaskIntoConstraints。不过,我真的不认为我应该将这些设置为true。我的子视图只有Autolayout规则。

2 个答案:

答案 0 :(得分:2)

对不起 - 显然,我错误地搞砸了约束。似乎设置wAny hAny的约束也搞砸了其他大小类的约束。我只是重新应用了约束。

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

  • 必须为集合视图单元格设置translatesAutoresizingMaskIntoConstraints,并将其contentView设置为false。只需在单元格的子视图上应用Autolayout规则即可。 (实际上,对于未应用Autolayout的任何视图,请不要禁用translatesAutoresizingMaskIntoConstraints。)
  • 与@ pteofil的回答相反,UICollectionViewCell实际上会响应大小类和特征集合(可以从单元格内部调用self.traitCollection)。您可以为一个大小类设置一组Autolayout规则,为另一个规则类设置一组不同的规则。
  • 如果您对所有可能的大小类都有规则,则不必为wAny hAny设置任何内容。但是,您可以在那里添加由您所定位的所有大小类共享的规则,但是您不必因为IB中的约束不足而使该红色错误消失。
  • 您仍需要在collectionView:layout:sizeForItemAtIndexPath:
  • 中正确设置集合视图单元格的大小
  • 似乎保持此类问题不发生的唯一方法是非常,非常,非常谨慎地设置IB中的约束。
  • 作为附加提示,请真正查看控制台的输出,其中列出了不可满足的约束。打印视图的description以获取其地址并识别正在显示的视图。我个人意识到当控制台打印出一个我没有故意在受影响的视图上添加的约束时,用wAny hAny搞乱了另一个大小类的规则。

答案 1 :(得分:0)

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

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

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