全宽UICollectionViewCells,自动布局约束和旋转问题

时间:2017-10-12 12:51:01

标签: swift autolayout uicollectionviewcell

我试图为我的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的宽度减去左边和右边的插入值,减去内容插入左右值。

从横向旋转到纵向时,即使布局无效

1 个答案:

答案 0 :(得分:0)

您应该使用此委托方法来控制/更改单元格的大小:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.width, height: cellHeight);
}

这将使您的单元格返回您的大小,而不需要破坏约束,或重新配置屏幕旋转的约束。