说明
控件基于UIView封装完成,采用UIPanGestureRecognizer监听自身的触摸事件,以此处理各种滑动动画操作。 内容之间可以循环切换,采用类似tableView加载机制,达到复用效果
效果
代码实现
#import@class SMSwipeView;@protocol SMSwipeDelegate @required//获取显示数据内容-(UITableViewCell*)SMSwipeGetView:(SMSwipeView*)swipe withIndex:(int)index;//获取数据源总量-(NSInteger)SMSwipeGetTotaleNum:(SMSwipeView*)swipe;@end@interface SMSwipeView : UIView@property(nonatomic,weak)id delegate;//层叠透明方式显示 默认NO@property(nonatomic,assign)BOOL isStackCard;//加载方法-(void)reloadData;//根据id获取缓存的cell-(UITableViewCell*)dequeueReusableUIViewWithIdentifier:(NSString*)identifier;@end复制代码
#import "SMSwipeView.h"#define degreeTOradians(x) (M_PI * (x)/180)//childView距离父View左右的距离const int LEFT_RIGHT_MARGIN=10;//当前view距离父view的顶部的值const int TOP_MARGTIN=16;@interface SMSwipeView()//已经划动到边界外的一个view@property(nonatomic,weak)UITableViewCell * viewRemove;//放当前显示的子View的数组@property(nonatomic,strong)NSMutableArray * cacheViews;//view总共的数量@property(nonatomic,assign)int totalNum;//当前的下标@property(nonatomic,assign)int nowIndex;//触摸开始的坐标@property(nonatomic,assign)CGPoint pointStart;//上一次触摸的坐标@property(nonatomic,assign)CGPoint pointLast;//最后一次触摸的坐标@property(nonatomic,assign)CGPoint pointEnd;//正在显示的cell@property(nonatomic,weak)UITableViewCell * nowCell;//下一个cell@property(nonatomic,weak)UITableViewCell * nextCell;//第三个cell@property(nonatomic,weak)UITableViewCell * thirdCell;//自身的宽度@property(nonatomic,assign)int w;//自身的高度@property(nonatomic,assign)int h;//是否是第一次执行@property(nonatomic,assign)BOOL isFirstLayoutSub;@end@implementation SMSwipeView//从xib中加载该类-(void)awakeFromNib{ [super awakeFromNib]; [self initSelf];}//直接用方法初始化-(instancetype)initWithFrame:(CGRect)frame{ self=[super initWithFrame:frame]; [self initSelf]; return self;}//进行一些自身的初始化和设置-(void)initSelf{ self.clipsToBounds=YES; self.cacheViews=[[NSMutableArray alloc]init]; //手势识别 UIPanGestureRecognizer * pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; [self addGestureRecognizer:pan];}//布局subview的方法-(void)layoutSubviews{ if(!self.isFirstLayoutSub){ self.isFirstLayoutSub=YES; self.w=self.bounds.size.width; self.h=self.bounds.size.height; [self reloadData]; }}//重新加载数据方法,会再首次执行layoutSubviews的时候调用-(void)reloadData{ if (!self.delegate||![self.delegate respondsToSelector:@selector(SMSwipeGetView:withIndex:)]||![self.delegate respondsToSelector:@selector(SMSwipeGetTotaleNum:)]) { return; } self.totalNum=(int)[self.delegate SMSwipeGetTotaleNum:self]; self.viewRemove=nil; UITableViewCell * nowCell=[self.delegate SMSwipeGetView:self withIndex:self.nowIndex]; UITableViewCell * nextCell=[self.delegate SMSwipeGetView:self withIndex:self.nowIndex+1
源码下载
更多文章