2012-12-06 122 views
5

我正在瀏覽Apple的UICollectionView示例代碼,我在想如果有人能向我解釋某些東西。他們使用此代碼來停止集合視圖中的水平滾動:停止UICollectionView中的滾動

- (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?任何想法將不勝感激。謝謝!

回答

3

該代碼的目的是調整滾動結束位置,使其「捕捉」到特定的單元格。這是通過offsetAdjustment完成的。 MAXFLOAT只是初始值;在循環內offsetAdjustment迭代地減小到目標幀的中心與最接近目標幀中間的單元之間的水平距離。

通過返回目標幀偏移量這個x量,滾動將捕捉到這個最近的單元格。