1

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

我的单元格有一个 stackView,我希望轴是水平的紧凑尺寸类和垂直的常规。

这是我尝试过的:

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在单元类本身中打印来正确更改轴。所以问题似乎是单元格没有重绘..

单元格布局问题

有什么建议我应该如何解决这个问题?

Github 回购

4

1 回答 1

5

添加对该方法的调用,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
}
于 2016-06-07T11:20:38.033 回答