视图转换后调整 UICollectionView 的大小

Posted

技术标签:

【中文标题】视图转换后调整 UICollectionView 的大小【英文标题】:Resize UICollectionView after view transition 【发布时间】:2014-11-15 09:43:05 【问题描述】:

我在 Interface Builder 中构建了详细视图,显示有关某些对象的信息和照片。因为信息的长度和照片的数量会有所不同,所以都嵌套在UIScrollView中。

照片在UICollectionView 中显示,但我需要始终显示所有包含的照片,因此我禁用了滚动并通过此函数(在完成渲染单元格时调用)动态更改UICollectionViewHeight 约束:

func resizePhotosCollectionView() 
    photosCollectionViewHeightConstraint.constant = photosCollectionView.collectionViewLayout.collectionViewContentSize()

在此 UICollectionView 需要调整大小(通常通过设备方向更改)之前,它工作得很好。我正在尝试在函数中使用UIViewControllerTransitionCoordinator

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    coordinator.animateAlongsideTransition(nil)  context in
        self.resizePhotosCollectionView()
    
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

但结果很不稳定,因为转换完成后Height 约束发生了变化。

有什么方法可以在视图转换后自动调整UICollectionView 的大小?如果没有,如何在过渡期间为Height 约束更改设置动画?

对目标 ios 8 使用 Xcode 6.1。

【问题讨论】:

【参考方案1】:

如果我没记错的话,您需要立即布局视图。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    coordinator.animateAlongsideTransition(nil)  context in
        self.resizePhotosCollectionView()
        self.view.setNeedsLayout()
        self.view.layoutIfNeeded()
    
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

【讨论】:

【参考方案2】:

您是否尝试过将约束更新包装到视图动画中?

photosCollectionViewHeightConstraint.constant =
    photosCollectionView.collectionViewLayout.collectionViewContentSize()
photosCollectionView.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.3, animations:  () -> Void in
    photosCollectionView.layoutIfNeeded()
)

【讨论】:

这几乎是完美的解决方案,尤其是在后续视图中同时调用setNeedsUpdateConstraintslayoutIfNeeded 时(在UICollectionView 下方)。谢谢蒙迪!

以上是关于视图转换后调整 UICollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 单元格子视图不调整大小

如何在 UICollectionView 中动态调整标题视图的大小?

使用布局约束调整 UICollectionView 的大小。节标题移动

如何根据里面的 UILabel 子视图调整 UICollectionView 中的单元格大小

如何将 UICollectionView 项目的大小调整为具有集合视图高度的正方形大小?

UICollectionView 内容未正确调整大小