UICollectionViewCell 和自动布局缩放

Posted

技术标签:

【中文标题】UICollectionViewCell 和自动布局缩放【英文标题】:UICollectionViewCell and Autolayout scaling 【发布时间】:2014-05-27 21:17:41 【问题描述】:

我已经构建了一个普通的 UICollectionView,它使用的单元格是我屏幕的全尺寸...

我使用的 ViewCell 是在 IB 中定义的,尺寸为 320x568,并且我添加了自动布局约束,当窗口大小发生变化时应该允许它们按比例缩小。

有没有办法让正常的集合视图流布局检测可用窗口(通话栏、3.5 英寸屏幕等)中的变化,并更新视单元默认大小以使其与可用窗口匹配房地产,还是需要定制代码来监听分辨率的变化?如果是这样,我需要采用什么方法来捕捉窗口大小的这种变化?

【问题讨论】:

【参考方案1】:

这可能有效:

子类化 UICollectionViewFlowLayout 并像这样覆盖方法 (shouldInvalidateLayoutForBoundsChange):

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds

    [self invalidateLayout];
    return YES;

这将在 collectionView 的边界更改时强制刷新布局。 (例如旋转)。

您还必须实现以下 UICollectionViewDelegate 方法:

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

    return self.collectionView.bounds.size;

现在如果你对你的 collectionsView 有很好的约束,它的框架应该随着窗口的变化而更新,并导致布局更新。

让我知道它是否有效:)

【讨论】:

据我所知,这不会导致实际项目大小的更新,因此即使布局更新,单元格也不会在需要时按比例缩小。 我编辑了我的答案。在一个小项目上测试过,它似乎可以工作。 我不确定我是否理解,这如何解决设置项目大小以使其保持“全屏”并处理对状态栏高度的修改的问题? Invalidate Layout 只是告诉运行时它应该重新计算事物,但我看不出您如何根据可用的屏幕约束指示新的项目大小。 另外,我所做的只是让您可以随时将项目保持在您的 collectionView 的大小。现在你必须对其施加正确的约束

以上是关于UICollectionViewCell 和自动布局缩放的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元内的 UICollectionViewCell 和自动布局

UICollectionViewCell 以编程方式自动布局

UICollectionViewCell 自动布局

自动布局:无法获取 UICollectionViewCell 子视图的帧大小

使用自动布局时无法隐藏或删除 UICollectionViewCell 中的视图

如何使用自动布局在 iPhone 6 和 6 Plus 中调整 UICollectionViewCell 的大小