5

UICollectionView の Apple のサンプル コードを調べていますが、誰かが私に何か説明してくれるかどうか疑問に思っていました。このコードを使用して、コレクション ビューで水平スクロールを停止します。

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
    CGFloat offsetAdjustment = MAXFLOAT;
    CGFloat horizontalCenter = proposedContentOffset.x + (CGRectGetWidth(self.collectionView.bounds) / 2.0);

    CGRect targetRect = CGRectMake(proposedContentOffset.x, 0.0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);
    NSArray* array = [super layoutAttributesForElementsInRect:targetRect];

    for (UICollectionViewLayoutAttributes* layoutAttributes in array) {
        CGFloat itemHorizontalCenter = layoutAttributes.center.x;

        if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offsetAdjustment)) {
            offsetAdjustment = itemHorizontalCenter - horizontalCenter;
        }
    }    
    return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y);
}

彼らが何をしようとしているのか分かりません。私が理解している唯一の部分は、targetRect を作成し、targetRect 内のそれらの要素の属性を取得することです。しかし、そこからは、彼らが何をしているのかわかりません。このオフセット調整はどこから来たのですか? MAXFLOAT を使用する理由 どんな考えでも大歓迎です。ありがとう!

4

1 に答える 1

3

コードの目的は、特定のセルに「スナップ」するようにスクロールの終了位置を調整することです。これは で行われoffsetAdjustmentます。MAXFLOATは初期値です。ループ内offsetAdjustmentで、ターゲット フレームの中心とターゲット フレームの中央に最も近いセルとの間の水平距離まで繰り返し減少します。

この x 量だけターゲット フレーム オフセットを返すことにより、スクロールはこの最も近いセルにスナップします。

于 2012-12-28T01:15:41.597 に答える