我在水平尺寸等级发生变化时调整单元格的布局时遇到问题。
我的单元格有一个stackView,我希望轴为Compact尺寸类为Horizontal,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
和单元类本身中打印来正确更改轴。所以问题似乎是细胞没有重新绘制..
我应该如何解决这个问题?
答案 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
}