使用uicollectionview 实现单元格滑动吸附效果
Posted 狙击BUG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用uicollectionview 实现单元格滑动吸附效果相关的知识,希望对你有一定的参考价值。
项目中遇到的需求,需要作出每个单元格必须完全显示.
使用uicolectionview可以实现:
collectionview的布局全部由UICollectionViewFlowLayout控制.
UICollectionViewFlowLayout的一个方法控制滑动结束单元格的停止位置:
-(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
所以必须重写这个方法:
.h文件
#import <UIKit/UIKit.h>
@interface Customlayout : UICollectionViewFlowLayout
@end
.m文件
#import "Customlayout.h"
@implementation Customlayout
-(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
//1.计算scrollview最后停留的范围
CGRect lastRect ;
lastRect.origin = proposedContentOffset;
lastRect.size = self.collectionView.frame.size;
//2.取出这个范围内的所有属性
NSArray *array = [self layoutAttributesForElementsInRect:lastRect];
//起始的x值,也即默认情况下要停下来的x值
CGFloat startX = proposedContentOffset.x;
//3.遍历所有的属性
CGFloat adjustOffsetX = MAXFLOAT;
for (UICollectionViewLayoutAttributes *attrs in array) {
CGFloat attrsX = CGRectGetMinX(attrs.frame); //单元格x
CGFloat attrsW = CGRectGetWidth(attrs.frame) ; //单元格宽度
if (startX - attrsX < attrsW/2) { //小于一半
adjustOffsetX = -(startX - attrsX);
}else{
adjustOffsetX = attrsW - (startX - attrsX);
}
break ;//只循环数组中第一个元素即可,所以直接break了
}
return CGPointMake(proposedContentOffset.x + adjustOffsetX, proposedContentOffset.y);
}
@end
以上是关于使用uicollectionview 实现单元格滑动吸附效果的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过使用 UICollectionViewCompositionalLayout 实现固定高度、动态宽度(包装内容)水平 UICollectionView 的单元格
点击时从 UICollectionView 中的单元格获取图像
如何使用 MVVM 和 RxSwift 编辑/删除 UICollectionView 单元格