我试图为我的UICollectionViewCells使用autolayout,并且需要宽度始终是collectionView的宽度。一切正常,直到我旋转屏幕(我知道你可以重新加载数据,但想知道是否有更优雅的解决方案)
基本上我有以下
class Cell: UICollectionViewCell {
@IBOutlet var cellWidthConstraint: NSLayoutConstraint!
override func awakeFromNib() {
super.awakeFromNib()
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.frame = bounds
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
override func layoutSubviews() {
super.layoutSubviews()
guard let superview = superview else {
return
}
cellWidthConstraint.constant = superview.frame.width
}}
单元格设置
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? Cell else {
return UICollectionViewCell()
}
cell.cellWidthConstraint.constant = collectionView.frame.width
return cell
}
旋转检测
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
guard let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout else {
return
}
flowLayout.invalidateLayout()
}
并且estimatedItemSize
已设置为UICollectionViewFlowLayoutAutomaticSize
这是有效的,但是当我旋转设备时会出现布局约束,这些约束来自contentView上的约束集。我不知道他们为什么会出现这种情况,但是如果有人能够解决问题,或者有更好的方法可以做到这一点,那就太棒了!
更新
将viewWillTransition
更改为此...
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { _ in
self.collectionView?.collectionViewLayout.invalidateLayout()
}, completion: nil)
}
我现在得到一个
未定义UICollectionViewFlowLayout的行为,因为: 项目宽度必须小于UICollectionView的宽度减去左边和右边的插入值,减去内容插入左右值。
从横向旋转到纵向时,即使布局无效
答案 0 :(得分:0)
您应该使用此委托方法来控制/更改单元格的大小:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width, height: cellHeight);
}
这将使您的单元格返回您的大小,而不需要破坏约束,或重新配置屏幕旋转的约束。