如何计算从具有自动布局纵横比约束的 xib 加载的 UICollectionViewCell 的大小?
How can I calculate the size of a UICollectionViewCell loaded from a xib with autolayout aspect ratio constraints?
我有一个从 xib 加载并存储在 属性 中的 UICollectionViewCell,以帮助计算我的集合视图的单元格大小。集合视图始终只有一列,因此单元格的宽度会根据用户拥有的 phone (iphone 5/6/6+) 而变化。 xib 有一个图像视图,其纵横比必须对所有 phone 尺寸保持不变。
我 运行 遇到的问题源于此配置。我似乎无法根据固定宽度按照我想要的方式制作单元格大小。我的 sizeForItemAtIndexPath:
方法如下所示:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
self.sizingCell.frame.size.width = self.flowLayout.fullViewSectionSize.width;
[self configureCell:self.sizingCell atIndexPath:indexPath];
[self.sizingCell setNeedsLayout];
[self.sizingCell layoutIfNeeded];
CGSize size = [self.sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size;
}
我正在做我读过的我应该用屏幕外的单元格进行动态尺寸计算,但问题是当调用 layoutIfNeeded
时,我得到一个不可满足的约束异常使用我的约束和一个额外的约束,将单元格的高度设置为 xib 中定义的高度。系统永远不会打破我没有添加的这个额外的高度限制,所以单元格的高度在 xib 中始终是设计时视图的这个不正确的高度。
我能以某种方式删除导致它不起作用的无关约束吗?是否有其他设置可以满足我的需要?我试过关闭 translatesAutoResizingMaskIntoConstraints
也无济于事。我怎样才能使加载 xib 的单元格根据涉及纵横比的约束计算出它的大小?
编辑:
如果你想看看我在说什么,我在此处的 github 存储库中整理了一个 swift 版本:https://github.com/klundberg/Autolayout-CollectionViewExample
我通过一些变通办法解决了这个问题。
最初,我的 xib 是一个集合视图单元格,其子视图是其中具有纵横比约束的图像。这与 iOS 添加到这些单元格(名为 "UIView-Encapsulated-Layout-Height/Width")的默认约束相冲突。我的解决方案是在单元格和我关心布局的视图之间引入一层视图,所以现在这是一个包含容器视图的单元格,容器视图包含我的图像视图。容器视图没有得到应用于它的封装布局约束,所以如果我为它创建一个 IBOutlet
并在该视图上调用 systemLayoutSizeFittingSize:
(而不是在设置其宽度后调用 contentView
,它将正确计算高度而没有约束冲突。
我有一个从 xib 加载并存储在 属性 中的 UICollectionViewCell,以帮助计算我的集合视图的单元格大小。集合视图始终只有一列,因此单元格的宽度会根据用户拥有的 phone (iphone 5/6/6+) 而变化。 xib 有一个图像视图,其纵横比必须对所有 phone 尺寸保持不变。
我 运行 遇到的问题源于此配置。我似乎无法根据固定宽度按照我想要的方式制作单元格大小。我的 sizeForItemAtIndexPath:
方法如下所示:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
self.sizingCell.frame.size.width = self.flowLayout.fullViewSectionSize.width;
[self configureCell:self.sizingCell atIndexPath:indexPath];
[self.sizingCell setNeedsLayout];
[self.sizingCell layoutIfNeeded];
CGSize size = [self.sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size;
}
我正在做我读过的我应该用屏幕外的单元格进行动态尺寸计算,但问题是当调用 layoutIfNeeded
时,我得到一个不可满足的约束异常使用我的约束和一个额外的约束,将单元格的高度设置为 xib 中定义的高度。系统永远不会打破我没有添加的这个额外的高度限制,所以单元格的高度在 xib 中始终是设计时视图的这个不正确的高度。
我能以某种方式删除导致它不起作用的无关约束吗?是否有其他设置可以满足我的需要?我试过关闭 translatesAutoResizingMaskIntoConstraints
也无济于事。我怎样才能使加载 xib 的单元格根据涉及纵横比的约束计算出它的大小?
编辑:
如果你想看看我在说什么,我在此处的 github 存储库中整理了一个 swift 版本:https://github.com/klundberg/Autolayout-CollectionViewExample
我通过一些变通办法解决了这个问题。
最初,我的 xib 是一个集合视图单元格,其子视图是其中具有纵横比约束的图像。这与 iOS 添加到这些单元格(名为 "UIView-Encapsulated-Layout-Height/Width")的默认约束相冲突。我的解决方案是在单元格和我关心布局的视图之间引入一层视图,所以现在这是一个包含容器视图的单元格,容器视图包含我的图像视图。容器视图没有得到应用于它的封装布局约束,所以如果我为它创建一个 IBOutlet
并在该视图上调用 systemLayoutSizeFittingSize:
(而不是在设置其宽度后调用 contentView
,它将正确计算高度而没有约束冲突。