2016-12-11 5 views
3

私はUICollectionViewセクションを1つだけ使用しています。Swift 3:UICollectionView内のセルの最後の行を1つのセクションで水平方向に中央に配置する方法は?

[ x x x ] 
[ x x x ] 
[ x x ] 

UICollectionViewの最後の行は、すべての3個のセルが満たされていない場合、私はそうのように、これらの細胞を中心したいと思います:ここではいくつかの可視化だ

[ x x x ] 
[ x x x ] 
[ x x ] 

私が実装しようとしました次の場所からソリューション:

  1. How to center horizontally UICollectionView Cells?

  2. How to center align the cells of a UICollectionView?

しかし、解決策は、すべてのセルをシフトし、私は私が唯一つのセクションを持っているので、その最後の行は、細胞のX番号が含まれていない場合にのみ、最後の行をシフトしたいと思います。

私はインセットを設定する方法を知っていますが、これは1つのセクションだけで、セルの最後の行にインセットを調整しようとすると、これをどのように達成するのか分かりません。

私はちょうどUICollectionViewを使用し始めましたが、この問題を回避する方法は不明ですか?

答えて

0

短い答えは: あなたは顧客UICollectionViewLayoutサブクラスを作成し、要素を自分で配置する必要があるとしている:あなたは、長い答えは、アップル

によって提供さUICollectionViewFlowLayoutを使用することはできません。まず、this tutorialに進みます。次に、独自のカスタムレイアウトを作成できるように内部の仕組みをよりよく理解する必要があります。

2

流れのレイアウトが少しカスタマイズして提供するすべてのものが必要なように思えます。

クイックで汚れた実装では、基本的にFlowLayoutに指定された矩形のレイアウトを実行し、最後の行に表示される項目を特定します。 3つ以下のアイテムがある場合は、それらを均等に配置します。あなたが挿入/欠失をアニメーション化を予定している場合、あなたもlayoutAttributesForCellWithIndexPath:をオーバーライドして、それが一貫性のある結果を返すことを確認する必要があること

class LastRowCenteredLayout: UICollectionViewFlowLayout { 
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
     guard var elementAttributes = super.layoutAttributesForElements(in: rect) else { return nil } 
     guard elementAttributes.count > 0 else { return elementAttributes } 

     elementAttributes = elementAttributes.map { $0.copy() as! UICollectionViewLayoutAttributes } 

     let minY = elementAttributes.last!.frame.minY 
     let lastRowAttrs = elementAttributes.reversed().filter { $0.frame.minY == minY } 

     guard lastRowAttrs.count < 3, 
       let first = elementAttributes.first, 
       let last = elementAttributes.last else { 
      return elementAttributes 
     } 

     let horizontalPadding = rect.width - first.frame.minX - last.frame.maxX 
     let horizontalShift = horizontalPadding/2.0 

     for attrs in lastRowAttrs { 
      attrs.frame = attrs.frame.offsetBy(dx: horizontalShift, dy: 0) 
     } 

     return elementAttributes 
    } 
} 

は注意してください。

AppleはFlowLayoutにサブクラス化専用のセクションを持つguideを持っています。

サンプル遊び場:

https://gist.github.com/AnuragMishra/0a694dfa9be1a5eab9fc7368b69812ad

関連する問題