UIKit框架(16)手势识别器
UIGestureRecognizer
利用手势识别器,能够轻松识别用户在某个view上面做一些常见的手势
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
UITapGestureRecognizer 敲击
UIPinchGestureRecognizer 捏合手势
UIPanGestureRecognizer 拖拽
UISwipeGestureRecognizer 轻扫
UIRotationGestureRecognizer 旋转
UILongPressGestureRecognizer 长按
手势识别器使用的一般步骤 (以敲击手势为例)
创建手势识别器对象
UITapGestureRecognizer*tap=[[UITapGestureRecognizeralloc]init];
设置手势识别器对象的具体属性 :
//连续敲击2次且两根手指敲击时响应tap.numberOfTapsRequired=2;tap.numberOfTouchesRequired=2;
添加手势识别器到view上 :
[self.iconViewaddGestureRecognizer:tap];
监听手势的触发 :
[tapaddTarger:selfaction:@selector(tapIconView:)];
实现触发的方法
-(void)tapIconView:(UITapGestureRecognizer*)tapGR{NSLog(@"tap响应");}
手势识别器的状态
手势识别器的代理
代理协议<UIGestureRecognizerDelegate>
//是否接受这个touch对象(默认返回YES),这个代理方法在一个触摸事件产生时先调用-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizershouldReceiveTouch:(UITouch*)touch;//确定两个类似的手势识别器是否同时处理-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizershouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer;
示例:UITabBarController的滑动手势控制
1)UITabBarController子类,保存所有子控制器的截图
添加UIImage对象数组
@property(nonatomic,strong)NSMutableArray<UIImage*>*picArray;
数组初始化为空对象
NSMutableArray*arr1=[NSMutableArrayarray];for(inti=0;i<self.viewControllers.count;i++){[arr1addObject:[NSNullnull]];}self.picArray=[arr1mutableCopy];
重写selectedIndex的setter方法:切换子控制器前,截图保存
-(void)setSelectedIndex:(NSUInteger)selectedIndex{//截图操作floatwidth=[UIScreenmainScreen].bounds.size.width;floatheight=[UIScreenmainScreen].bounds.size.height;UIGraphicsBeginImageContext(CGSizeMake(width,height));CGContextRefcontext=UIGraphicsGetCurrentContext();[[UIApplicationsharedApplication].keyWindow.layerrenderInContext:context];UIImage*p_w_picpath=UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();//截图保存到截图数组NSLog(@"selectedIndex=%ld",self.selectedIndex);self.picArray[self.selectedIndex]=p_w_picpath;[supersetSelectedIndex:selectedIndex];}
提供方法,返回当前子控制器的前后两个子控制器的截图
-(UIImage*)p_w_picpathForCurrentViewControllerLeft{if(self.selectedIndex==0){returnnil;}returnself.picArray[self.selectedIndex-1];}-(UIImage*)p_w_picpathForCurrentViewControllerRight{if(self.selectedIndex==self.viewControllers.count-1){returnnil;}returnself.picArray[self.selectedIndex+1];}
2)添加子控制器的共用父类
UITabBarController的所有子控制器的类型就是继承自一个共用父类
父类中添加滑动手势识别器
UIPanGestureRecognizer*gr1=[[UIPanGestureRecognizeralloc]init];[gr1addTarget:selfaction:@selector(panGR:)];[self.viewaddGestureRecognizer:gr1];
父类中添加UIImageView属性,用于存储当前页面左右两个截图p_w_picpathView
@property(nonatomic,weak)UIImageView*ivLeft;@property(nonatomic,weak)UIImageView*ivRight;
手势识别器:手势开始时,当前view左右放置截图
UIImage*imgLeft=[((ViewController*)self.tabBarController)p_w_picpathForCurrentViewControllerLeft];if(imgLeft==nil){self.ivLeft=nil;}else{if([imgLeftisKindOfClass:[NSNullclass]]){//一张白***片imgLeft=[UIImagep_w_picpathNamed:@"white_bg"];}UIImageView*ivLeft=[[UIImageViewalloc]initWithImage:imgLeft];self.ivLeft=ivLeft;[self.viewaddSubview:ivLeft];self.ivLeft.frame=CGRectMake(-self.view.frame.size.width,0,self.view.frame.size.width,self.view.frame.size.height);}UIImage*imgRight=[((ViewController*)self.tabBarController)p_w_picpathForCurrentViewControllerRight];if(imgRight==nil){self.ivRight=nil;}else{if([imgRightisKindOfClass:[NSNullclass]]){imgRight=[UIImagep_w_picpathNamed:@"white_bg"];}UIImageView*ivRight=[[UIImageViewalloc]initWithImage:imgRight];self.ivRight=ivRight;[self.viewaddSubview:self.ivRight];self.ivRight.frame=CGRectMake(self.view.frame.size.width,0,self.view.frame.size.width,self.view.frame.size.height);}
手势识别器:手势滑动式时,当前view随之滑动
if(p.x>0&&self.ivLeft==nil){return;}if(p.x<0&&self.ivRight==nil){return;}self.view.transform=CGAffineTransformMakeTranslation(p.x,0);
手势识别器,手势结束时,根据位置确定是否切换子控制器
if(self.view.transform.tx>self.view.frame.size.width/2&&self.ivLeft!=nil){self.view.transform=CGAffineTransformIdentity;self.tabBarController.selectedIndex--;if(self.ivLeft!=nil){[self.ivLeftremoveFromSuperview];self.ivLeft=nil;}if(self.ivRight!=nil){[self.ivRightremoveFromSuperview];self.ivRight=nil;}return;}if(self.view.transform.tx<-self.view.frame.size.width/2&&self.ivRight!=nil){self.view.transform=CGAffineTransformIdentity;self.tabBarController.selectedIndex++;if(self.ivLeft!=nil){[self.ivLeftremoveFromSuperview];self.ivLeft=nil;}if(self.ivRight!=nil){[self.ivRightremoveFromSuperview];self.ivRight=nil;}return;}[UIViewanimateWithDuration:0.5animations:^{self.view.transform=CGAffineTransformIdentity;}completion:^(BOOLfinished){if(self.ivLeft!=nil){[self.ivLeftremoveFromSuperview];self.ivLeft=nil;}if(self.ivRight!=nil){[self.ivRightremoveFromSuperview];self.ivRight=nil;}}];
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。