当traitCollection更改时更改单元格布局

时间:2016-06-07 09:03:46

标签: ios uicollectionview size-classes adaptive-layout

我在水平尺寸等级发生变化时调整单元格的布局时遇到问题。

我的单元格有一个stackView,我希望轴为Compact尺寸类为Horizo​​ntal,Vertical为Regular。

这就是我的尝试:

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    if previousTraitCollection?.horizontalSizeClass != traitCollection.horizontalSizeClass {
        self.collectionView?.reloadData()
    }
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell

    switch traitCollection.horizontalSizeClass {
    case .Compact:
        cell.stackView.axis = .Horizontal
    default:
        cell.stackView.axis = .Vertical
    }

    return cell
}

但结果是并非所有单元格都更新了它们的布局,请参见下面的gif。

修改 我已确认通过在cellForItem和单元类本身中打印来正确更改轴。所以问题似乎是细胞没有重新绘制..

Cell layout problems

我应该如何解决这个问题?

Github Repo

1 个答案:

答案 0 :(得分:2)

layoutIfNeeded()方法添加对cellForItemAtIndexPath的调用,以使堆栈视图重新传输其内容:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell

    switch traitCollection.horizontalSizeClass {
    case .Compact:
        cell.stackView.axis = .Horizontal
    default:
        cell.stackView.axis = .Vertical
    }

    cell.stackView.layoutIfNeeded()

    return cell
}