2017-08-08 3 views
0

私のコレクションビューにカスタムレイアウトを使用していますが、カスタムレイアウトを使用している場合sizeForItemAtメソッドが呼び出されていません。sizeForItemAtメソッドがカスタムレイアウトを使用しているときに呼び出さない

マイカスタムレイアウト:

public class HorizontalCollectionViewLayout : UICollectionViewLayout { 
    var itemSize = CGSize(width: 0, height: 0) { 
     didSet { 
      invalidateLayout() 
     } 
    } 
    private var cellCount = 0 
    private var boundsSize = CGSize(width: 0, height: 0) 

    public override func prepare() { 
     cellCount = self.collectionView!.numberOfItems(inSection: 0) 
     boundsSize = self.collectionView!.bounds.size 
    } 
    public override var collectionViewContentSize: CGSize { 
     let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height)) 
     let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width)) 

     let itemsPerPage = verticalItemsCount * horizontalItemsCount 
     let numberOfItems = cellCount 
     let numberOfPages = Int(ceil(Double(numberOfItems)/Double(itemsPerPage))) 

     var size = boundsSize 
     size.width = CGFloat(numberOfPages) * boundsSize.width 
     return size 
    } 

    public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
     var allAttributes = [UICollectionViewLayoutAttributes]() 
     if cellCount > 0 { 
     for i in 0...(cellCount-1) { 
      let indexPath = IndexPath(row: i, section: 0) 
      let attr = self.computeLayoutAttributesForCellAt(indexPath: indexPath) 
      allAttributes.append(attr) 
     } 
     } 
     return allAttributes 
    } 

    public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 
     return computeLayoutAttributesForCellAt(indexPath: indexPath) 
    } 

    public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 
     return true 
    } 

    private func computeLayoutAttributesForCellAt(indexPath:IndexPath) 
     -> UICollectionViewLayoutAttributes { 
      let row = indexPath.row 
      let bounds = self.collectionView!.bounds 

      let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height)) 
      let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width)) 
      let itemsPerPage = verticalItemsCount * horizontalItemsCount 

      let columnPosition = row % horizontalItemsCount 
      let rowPosition = (row/horizontalItemsCount)%verticalItemsCount 
      let itemPage = Int(floor(Double(row)/Double(itemsPerPage))) 

      let attr = UICollectionViewLayoutAttributes(forCellWith: indexPath) 

      var frame = CGRect(x: 0,y: 0,width: 0,height: 0) 
      frame.origin.x = CGFloat(itemPage) * bounds.size.width + CGFloat(columnPosition) * itemSize.width 
      frame.origin.y = CGFloat(rowPosition) * itemSize.height 
      frame.size = itemSize 
      attr.frame = frame 

      return attr 
    } 
} 

と私はviewDidLoad方法でこのレイアウトを設定しています:

その他のコレクションビューメソッドがnumberOfItemsInSectionまたはcellForItemAtなどのような細かい作業しているしかし、私はできません

let itemWidth = 100 
let itemHeight = 100 
let horizontalCV = HorizontalCollectionViewLayout(); 
horizontalCV.itemSize = CGSize(width: itemWidth, height: itemHeight) 

instagramCollection.collectionViewLayout = horizontalCV 
self.instagramCollection.delegate=self 
self.instagramCollection.dataSource=self 
コレクションビューのインセットまたはセルの間隔を設定します。

以下のコードを試しましたが、以下のメソッドは呼び出されません。

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize.init(width: (instagramCollection.frame.width/3.0), height: instagramCollection.frame.height/2.0) 
} 


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
} 
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 10.0 
} 
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 10.0 
} 

また、私も働いていないストーリーボードからinstetsと間隔を設定しようとしました。

すべてのインセットとスペーシングでゼロを使用しています。

この問題を解決するにはどうすればよいですか?

答えて

0

レイアウトデリゲートのコントローラー実装を追加する必要があります。 (これらのメソッドを追加しましたが、呼び出されません)

UICollectionViewDelegate、UICollectionViewDataSourceだけでなく、UICollectionViewDelegateFlowLayoutもそうです。

同様の拡張子。

extension YourController: UICollectionViewDelegateFlowLayout { 
func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize.init(width: (instagramCollection.frame.width/3.0), height: instagramCollection.frame.height/2.0) 
} 


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
} 
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 10.0 
} 
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 10.0 
} 
} 
+0

私はすでにUICollectionViewDelegateFlowLayoutを実装していますが、依然として呼び出していません。 –

関連する問題