在视图转换后调整UICollectionView的大小

时间:2014-11-15 09:43:05

标签: ios swift uiscrollview uicollectionview autolayout

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

照片显示在UICollectionView中,但我需要始终显示所有包含的照片,因此我禁用此功能的滚动和动态更改Height UICollectionView约束(在完成渲染时调用)细胞):

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约束更改设置动画?

将Xcode 6.1用于目标IOS 8.

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

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

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

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