2016-07-18 13 views
4

こんにちは私はUICollectionViewFlowLayout経由で私のコレクションのビューのセルを中心に役立つ必要があります。私の最終目標は、最初のセルを中央に置き、他のすべてのセルを中央にスナップすることです。ありがとう!ここでコンテナのUICollectionViewセルのセンタリング

は、それが今のようになります。 enter image description here

と私はそれが見えるようにしたい: enter image description here

私はSOにこの「ソリューション」を見つけたが、正常に動作しないようです。

class CenterAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout { 

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 

    let attributes = super.layoutAttributesForElementsInRect(rect) 

    // Constants 
    let leftPadding: CGFloat = 8 
    let interItemSpacing: CGFloat = 5 

    // Tracking values 
    var leftMargin: CGFloat = leftPadding // Modified to determine origin.x for each item 
    var maxY: CGFloat = -1.0 // Modified to determine origin.y for each item 
    var rowSizes: [[CGFloat]] = [] // Tracks the starting and ending x-values for the first and last item in the row 
    var currentRow: Int = 0 // Tracks the current row 
    attributes?.forEach { layoutAttribute in 

     // Each layoutAttribute represents its own item 
     if layoutAttribute.frame.origin.y >= maxY { 

      // This layoutAttribute represents the left-most item in the row 
      leftMargin = leftPadding 

      // Register its origin.x in rowSizes for use later 
      if rowSizes.count == 0 { 
       // Add to first row 
       rowSizes = [[leftMargin, 0]] 
      } else { 
       // Append a new row 
       rowSizes.append([leftMargin, 0]) 
       currentRow += 1 
      } 
     } 

     layoutAttribute.frame.origin.x = leftMargin 

     leftMargin += layoutAttribute.frame.width + interItemSpacing 
     maxY = max(layoutAttribute.frame.maxY, maxY) 

     // Add right-most x value for last item in the row 
     rowSizes[currentRow][1] = leftMargin - interItemSpacing 
    } 

    // At this point, all cells are left aligned 
    // Reset tracking values and add extra left padding to center align entire row 
    leftMargin = leftPadding 
    maxY = -1.0 
    currentRow = 0 
    attributes?.forEach { layoutAttribute in 

     // Each layoutAttribute is its own item 
     if layoutAttribute.frame.origin.y >= maxY { 

      // This layoutAttribute represents the left-most item in the row 
      leftMargin = leftPadding 

      // Need to bump it up by an appended margin 
      let rowWidth = rowSizes[currentRow][1] - rowSizes[currentRow][0] // last.x - first.x 
      let appendedMargin = (collectionView!.frame.width - leftPadding - rowWidth - leftPadding)/2 
      leftMargin += appendedMargin 

      currentRow += 1 
     } 

     layoutAttribute.frame.origin.x = leftMargin 

     leftMargin += layoutAttribute.frame.width + interItemSpacing 
     maxY = max(layoutAttribute.frame.maxY, maxY) 
    } 

    return attributes 
} 

答えて

2

あなたのビューコントローラは、コレクションビューのデリゲートであることを確認してくださいとUICollectionViewDelegateFlowLayoutから次のメソッドを実装します。collectionViewLayout:sizeForItemAtIndexPath

UICollectionViewDelegateFlowLayoutを使用して
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 
    let sideInset = (collectionView.frame.size.width - myCollectionViewCellSize.width)/2 
    return UIEdgeInsets(top: 0, left: sideInset, bottom: 0, right: sideInset) 
} 
+0

どのように 'myCollectionViewCellSize'を参照していますか? – Hightower98

+0

申し訳ありませんが、私は明らかにすべきです。あなたはあなたのセルサイズが何であれそれを置き換える必要があります。 –

+0

私のセルサイズでは、インターフェイスビルダで定義されたセル幅を意味しますか? Xcodeでは整数を入力できないためです。例えば、 '(collectionView.frame.size.width - 690.width)'を入れて、 '型の値 'Int'のメンバーに 'width'というエラーがありました – Hightower98

0

、メソッドcollectionViewがあります。そこ

あなたがちょうどそうのようなあなたの幅のためにいくつかの計算を行う(のは、この例では、それは10.0と定義された変数だとしましょう)したいどのくらいの余白を定義します:

LET幅= collectionView.frame.size.width - (margin * 2)

そしてそこから幅と高さのCGSizeを返します。

あなたのアプリは複数のレイアウトをサポートしていますか(ポートレート/ランドスケープ、iPadsのマルチタスク)?また、willTransitionToTraitCollectionとviewWillTransitionToSizeを実装することを忘れないでください。ビューの幅がすべて変更されるため、これらのケースでもセルを更新する必要があります。

関連する問題