我正在浏览Apple的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?任何想法将不胜感激。谢谢!
答案 0 :(得分:3)
代码的目的是调整滚动结束位置,使其“快速”按下“到特定的细胞。这是通过offsetAdjustment
完成的。 MAXFLOAT
只是初始值;在循环offsetAdjustment
内迭代地减少到目标帧的中心和最靠近目标帧中间的单元之间的水平距离。
通过将此目标帧偏移量返回此x值,滚动将捕捉到此最近的单元格。