您的位置:首页 > 产品设计 > UI/UE

第04天实战技术(16):UICollectionView定位

2017-03-30 00:00 232 查看
#####一、UICollectionView定位

定位效果:控制偏移量
0.获取最终显示的区域
1.获取最终显示的cell
2.记录最小间距
3.计算中心点的距离
4.重新设置最终的偏移量
5.bug处理(-0)


0.获取最终显示的区域

CGRect targerRect = CGRectMake(targetP.x, 0, collectionViewW, MAXFLOAT);


1.获取最终显示的cell

NSArray *attrs = [super layoutAttributesForElementsInRect:targerRect];


2.记录最小间距

CGFloat minDelta = MAXFLOAT;


3.计算中心点的距离

for (UICollectionViewLayoutAttributes *attr in attrs) {
// 获取中心点的距离
CGFloat delta = (attr.center.x - self.collectionView.contentOffset.x) - self.collectionView.bounds.size.width * 0.5;
if (fabs(delta) < fabs(minDelta) ) {
minDelta = delta;
}
}


4.重新设置最终的偏移量

targetP.x += minDelta;


5.bug处理(-0)

if (targetP.x < 0) {
targetP.x = 0;
}


code

#pragma 5.确定最终的偏移量 和 手指离开的偏移量
// 什么时候调用 : 用户手指一松开就会调用
// 作用 : 确定最终的偏移量
// 定位 : 距离中心点越近, 最终展示到中心点
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
// NSLog(@"调用了 %s",__func__);
// 拖动比较快的时候 最终偏移量 是否等于 手指离开的偏移量 (不等于,因为滚动太快 还有一个缓存)
// 最终偏移量
CGPoint targetP = [super targetContentOffsetForProposedContentOffset:proposedContentOffset withScrollingVelocity:velocity];

CGFloat collectionViewW = self.collectionView.bounds.size.width;
// 0.获取最终的显示的区域
CGRect targerRect = CGRectMake(targetP.x, 0, collectionViewW, MAXFLOAT);

// 1.获取最终显示的cell
NSArray *attrs = [super layoutAttributesForElementsInRect:targerRect];

// 记录最小间距
CGFloat minDelta = MAXFLOAT;

for (UICollectionViewLayoutAttributes *attr in attrs) { // 获取中心点的距离 CGFloat delta = (attr.center.x - self.collectionView.contentOffset.x) - self.collectionView.bounds.size.width * 0.5; if (fabs(delta) < fabs(minDelta) ) { minDelta = delta; } }
targetP.x += minDelta;

if (targetP.x < 0) { targetP.x = 0; }
NSLog(@"%f",targetP.x);

return targetP;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息