如何计算从具有自动布局宽高比约束的xib加载的UICollectionViewCell的大小?

时间:2015-05-07 23:14:36

标签: ios objective-c autolayout xib uicollectionviewcell

我有一个从xib加载并存储在属性中的UICollectionViewCell,以帮助计算我的集合视图的单元格大小。集合视图始终只有一列,因此单元格的宽度根据用户的手机而有所不同(iphone 5/6/6 +)。 xib的图像视图的宽高比必须对所有手机尺寸保持不变。

我遇到的问题源于此配置。基于固定的宽度,我似乎无法按照我想要的方式制作单元尺寸。我的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回购中加入了一个快速版本:https://github.com/klundberg/Autolayout-CollectionViewExample

1 个答案:

答案 0 :(得分:0)

我通过一些解决方法想出了这个。

最初,我的xib是一个集合视图单元,其子视图是一个纵横比约束的图像。这与iOS添加到这些单元格的默认约束(名为“UIView-Encapsulated-Layout-Height / Width”)相冲突。我的解决方案是在单元格和我关心布局的视图之间引入一个级别的视图,所以现在这是一个包含容器视图的单元格,其中包含我的图像视图。容器视图未获取应用于其的封装布局约束,因此如果我为其设置IBOutlet并在该视图上调用systemLayoutSizeFittingSize:(而不是在设置其宽度后调用contentView,它将正确计算高度,没有约束冲突。