7

カスタムUICollectionViewLayoutサブクラスの実装中に、この奇妙な動作が見つかりました。以外のサブクラスのメソッドを設定しましたcollectionViewContentSize。すべてのセルが期待どおりに表示されましたが、contentView長すぎました。本来あるべきものの約2倍に見えました。

正しい を取得するために、以下のメソッドを実装しましたcontentSize。ただし、現在は期待値でprepareLayoutあり、ビューが 1 ピクセルスクロールするたびに呼び出されます。つまり、0,0 から 0,500 までスワイプすると、 prepareLayout500 回呼び出されます。

collectionViewContentSizeそれを引き起こす可能性があるのは私の何ですか?

- (CGSize)collectionViewContentSize {
    UICollectionViewLayoutAttributes *leftAttributes = (UICollectionViewLayoutAttributes *)self.layoutInfo[@"segmentCell"][[NSIndexPath indexPathForItem:[self.collectionView numberOfItemsInSection:0]-1 inSection:0]];
    UICollectionViewLayoutAttributes *rightAttributes = (UICollectionViewLayoutAttributes *)self.layoutInfo[@"segmentCell"][[NSIndexPath indexPathForItem:[self.collectionView numberOfItemsInSection:1]-1 inSection:1]];
    float leftHeight = leftAttributes.frame.size.height + leftAttributes.frame.origin.y;
    float rightHeight = rightAttributes.frame.size.height + rightAttributes.frame.origin.y;
    float maxHeight = leftHeight > rightHeight ? leftHeight : rightHeight;
    return CGSizeMake(self.collectionView.bounds.size.width, maxHeight);
}
4

2 に答える 2

13

ドキュメントによると [0]shoulInvalidateLayoutForBoundsChange:はデフォルトで NO を返すはずですが、そうではありませんでした。私がそれを実装し、すべての場合に NO を返すようにするprepareLayoutと、境界が変更されるたびに呼び出されなくなりました。UICollectionViewLayout のバグのようです。

[0] http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewLayout_class/Reference/Reference.html

于 2013-04-09T14:55:19.577 に答える