视图转换后调整 UICollectionView 的大小
Posted
技术标签:
【中文标题】视图转换后调整 UICollectionView 的大小【英文标题】:Resize UICollectionView after view transition 【发布时间】:2014-11-15 09:43:05 【问题描述】:我在 Interface Builder 中构建了详细视图,显示有关某些对象的信息和照片。因为信息的长度和照片的数量会有所不同,所以都嵌套在UIScrollView
中。
照片在UICollectionView
中显示,但我需要始终显示所有包含的照片,因此我禁用了滚动并通过此函数(在完成渲染单元格时调用)动态更改UICollectionView
的Height
约束:
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()
)
【讨论】:
这几乎是完美的解决方案,尤其是在后续视图中同时调用setNeedsUpdateConstraints
和layoutIfNeeded
时(在UICollectionView
下方)。谢谢蒙迪!以上是关于视图转换后调整 UICollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UICollectionView 中动态调整标题视图的大小?
使用布局约束调整 UICollectionView 的大小。节标题移动
如何根据里面的 UILabel 子视图调整 UICollectionView 中的单元格大小