博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios 卡片切换效果
阅读量:6191 次
发布时间:2019-06-21

本文共 2773 字,大约阅读时间需要 9 分钟。

说明

控件基于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

源码下载

更多文章

转载地址:http://itrda.baihongyu.com/

你可能感兴趣的文章
Exchange Server 2013多域名证书申请
查看>>
怎么把PDF文件转换成Word?三招教你轻松搞定
查看>>
SQL Server- 行列转换 行转列,多行转多列 - max 函数用法
查看>>
postgresql之角色和权限
查看>>
php安全
查看>>
学习笔记二
查看>>
cocos2d-js 小知识
查看>>
QEMU guest agent和资源的收集
查看>>
访问网络共享
查看>>
学习日志---linux shell编程之while和until
查看>>
hadoop上安装snappy
查看>>
Response.Flush和Response.BufferOutput
查看>>
图书《HTML5 App商业开发实战教程》读后小感(一)
查看>>
Python 官方文档解读(1):66 个内置函数
查看>>
使用prometheus及grafana对spring-boot&dubbo项目增加监控(一)
查看>>
HTTP协议详解
查看>>
帧中继和路由协议详解-在帧中继点到点子接口上运行EIGRP
查看>>
Writing a service of one’s own -- One time Request and back again
查看>>
struts2文件上传
查看>>
python 编写server的步骤:
查看>>