与大小 类 相关且在 Interface Builder 中定义的自动布局规则在 UICollectionViewCell 中被破坏
Autolayout rules relative to size classes and defined in Interface Builder are broken in UICollectionViewCell
我正在 Interface Builder 中定义自定义 UICollectionViewCell 的自动布局规则。我有两套规则:
- 一个用于竖屏 iPhone(wCompact、hRegular)。在此大小 class 中,我的垂直滚动集合视图仅显示一列单元格。
- 另一个用于横屏 iPhone 和 iPad(wRegular、hAny)。在这些大小 classes 中,集合视图显示两列单元格。
我似乎已经正确设置了这些规则,因为当我在 Assistant Editor 中查看预览时,即使我旋转设备屏幕,单元格也会按预期呈现。但是,当我 运行 应用程序时,第二组布局规则(用于横向模式的规则)在模拟器处于横向模式时中断。控制台打印出自动调整蒙版已应用于某些视图,我需要禁用它。
这对我来说根本没有意义——我在 IB 的视图上使用了自动布局,因此应该禁用自动调整掩码。我已经尝试了以下方法,但仍然无法正常工作:
self.contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
awakeFromNib()
。这只会让控制台安静下来,但布局仍然一团糟。 这也会破坏纵向模式的布局。
对于我指定的两个尺寸 classes,IB 没有抛出任何错误。但是,它确实适用于 wAny hAny。我没有为该大小 class 指定足够的约束,因为我认为它毫无意义——我有规则 所有 大小 classes 的可能组合。无论如何,我尝试添加占位符约束并在 IB 中检查 "Remove at build time" 。 IB 错误消失了,但根本没有修复错误。
有什么想法吗?
补充:我刚刚发现——单元格本身及其 contentView
的 translatesAutoresizingMaskIntoConstraints
属性 默认为 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 的回答相反,
UICollectionViewCell
s 实际上会响应大小 classes 和特征集合(你 可以 调用 self.traitCollection
从单元格内)。您可以为一种尺寸设置一组自动版式规则 class,为另一种尺寸设置另一组自动布局规则。
- 如果您对所有可能的大小 class 都有规则,则根本不必为
wAny hAny
设置任何内容。但是,您可以在其中添加由您所定位的所有大小 classes 共享的规则,但您不必让 IB 中因约束不足而导致的红色错误消失。
- 您仍然需要在
collectionView:layout:sizeForItemAtIndexPath:
中正确设置集合视图单元格的大小。
- 看来要防止这种问题发生的唯一方法就是在IB中非常非常非常小心地设置约束。
- 作为附加提示,请仔细查看控制台的输出,其中列举了无法满足的约束条件。打印您的视图的
description
以获取它们的地址并确定所指示的视图。我个人意识到当控制台打印一个我没有故意添加到受影响的视图上的约束时,玩弄 wAny hAny
弄乱了另一个尺寸 class 的规则。
我正在 Interface Builder 中定义自定义 UICollectionViewCell 的自动布局规则。我有两套规则:
- 一个用于竖屏 iPhone(wCompact、hRegular)。在此大小 class 中,我的垂直滚动集合视图仅显示一列单元格。
- 另一个用于横屏 iPhone 和 iPad(wRegular、hAny)。在这些大小 classes 中,集合视图显示两列单元格。
我似乎已经正确设置了这些规则,因为当我在 Assistant Editor 中查看预览时,即使我旋转设备屏幕,单元格也会按预期呈现。但是,当我 运行 应用程序时,第二组布局规则(用于横向模式的规则)在模拟器处于横向模式时中断。控制台打印出自动调整蒙版已应用于某些视图,我需要禁用它。
这对我来说根本没有意义——我在 IB 的视图上使用了自动布局,因此应该禁用自动调整掩码。我已经尝试了以下方法,但仍然无法正常工作:
self.contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
awakeFromNib()
。这只会让控制台安静下来,但布局仍然一团糟。 这也会破坏纵向模式的布局。对于我指定的两个尺寸 classes,IB 没有抛出任何错误。但是,它确实适用于 wAny hAny。我没有为该大小 class 指定足够的约束,因为我认为它毫无意义——我有规则 所有 大小 classes 的可能组合。无论如何,我尝试添加占位符约束并在 IB 中检查 "Remove at build time" 。 IB 错误消失了,但根本没有修复错误。
有什么想法吗?
补充:我刚刚发现——单元格本身及其 contentView
的 translatesAutoresizingMaskIntoConstraints
属性 默认为 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 的回答相反,
UICollectionViewCell
s 实际上会响应大小 classes 和特征集合(你 可以 调用self.traitCollection
从单元格内)。您可以为一种尺寸设置一组自动版式规则 class,为另一种尺寸设置另一组自动布局规则。 - 如果您对所有可能的大小 class 都有规则,则根本不必为
wAny hAny
设置任何内容。但是,您可以在其中添加由您所定位的所有大小 classes 共享的规则,但您不必让 IB 中因约束不足而导致的红色错误消失。 - 您仍然需要在
collectionView:layout:sizeForItemAtIndexPath:
中正确设置集合视图单元格的大小。 - 看来要防止这种问题发生的唯一方法就是在IB中非常非常非常小心地设置约束。
- 作为附加提示,请仔细查看控制台的输出,其中列举了无法满足的约束条件。打印您的视图的
description
以获取它们的地址并确定所指示的视图。我个人意识到当控制台打印一个我没有故意添加到受影响的视图上的约束时,玩弄wAny hAny
弄乱了另一个尺寸 class 的规则。