我在Interface Builder中定义了自定义UICollectionViewCell的Autolayout规则。我有两套规则:
我似乎正确设置了这些规则,因为当我在助理编辑器中查看预览时,即使我旋转设备屏幕,单元格也会按预期呈现自己。但是,当我运行应用程序时,第二组布局规则(横向模式)将在模拟器处于横向模式时中断。控制台打印出Autoresizing mask已应用于某些视图,我需要禁用它。
对我来说根本没有意义 - 我在IB中的视图上使用了Autolayout,因此应该禁用自动调整掩码。我尝试过以下操作,但仍然无法使用此功能:
self.contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
中有awakeFromNib()
。这只会让控制台安静,但布局仍然很乱。 这也会破坏纵向模式的布局。
对于我指定的两个大小类,IB不会抛出任何错误。但是,对于wAny hAny来说确实如此。我没有为该大小类指定足够的约束,因为我认为它没有意义 - 我有所有大小类的可能组合的规则。无论如何,我尝试添加占位符约束并检查"在构建时删除"在IB。 IB错误消失但它根本没有解决错误。
有什么想法吗?
添加:我刚发现 - 默认情况下,单元格本身及其contentView
的{{1}}属性为translatesAutoresizingMaskIntoConstraints
。不过,我真的不认为我应该将这些设置为true
。我的子视图只有Autolayout规则。
答案 0 :(得分:2)
对不起 - 显然,我错误地搞砸了约束。似乎设置wAny hAny
的约束也搞砸了其他大小类的约束。我只是重新应用了约束。
对于可能偶然发现这个问题的人,请注意:
translatesAutoresizingMaskIntoConstraints
,并将其contentView
设置为false。只需在单元格的子视图上应用Autolayout规则即可。 (实际上,对于未应用Autolayout的任何视图,请不要禁用translatesAutoresizingMaskIntoConstraints
。)UICollectionViewCell
实际上会响应大小类和特征集合(可以从单元格内部调用self.traitCollection
)。您可以为一个大小类设置一组Autolayout规则,为另一个规则类设置一组不同的规则。wAny hAny
设置任何内容。但是,您可以在那里添加由您所定位的所有大小类共享的规则,但是您不必因为IB中的约束不足而使该红色错误消失。collectionView:layout:sizeForItemAtIndexPath:
。description
以获取其地址并识别正在显示的视图。我个人意识到当控制台打印出一个我没有故意在受影响的视图上添加的约束时,用wAny hAny
搞乱了另一个大小类的规则。答案 1 :(得分:0)
UICollectionViewCell不受设备方向的影响。它们保持大小,只有显示它们的CollectionView会随着旋转而改变大小,因此您可以在一行上放置1或2个单元格。
您必须实现UICollectionViewDelegateFlowLayout并根据设备方向为单元格返回不同的大小。
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath