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 を参照してください。

EDIT: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 に答える