当前位置: 首页 > 科技观察

iOS开发教程的手势识别方法

时间:2023-03-12 16:21:12 科技观察

感觉有必要对iOS开发中的手势识别做一个小总结。上一篇iOS开发自定义表情键盘(组件封装及自动布局)博客中使用了一个点击手势,即点击TextView时从表情键盘返回到系统键盘。TextView中的hand是添加了storyboard的。下面会先展示如何使用storyboard给相应的控件添加手势,然后用纯代码的方式给我们的控件添加手势。手势的使用相对简单。和button的用法类似,也是一个目标动作回调。话不多说,进入今天的主题。一共有六种手势识别:点击手势(TapGestureRecognizer)、滑动手势(SwipeGestureRecognizer)、长按手势(LongPressGestureRecognizer)、拖动手势(PanGestureRecognizer)、捏合手势(PinchGestureRecognizer)、旋转手势(RotationGestureRecognizer);其实这些手势是可以用触摸事件来实现的。苹果将??常用的触摸事件封装成手势提供给用户。读者可以使用TouchesMoved编写拖动手势等,使用storyboard为控件添加手势识别。当然,使用故事板来获取屏幕截图。1.在storyboard中添加手势识别与添加Button是一样的。首先,我们要找到对应的手势,将手势识别控件拖到我们要添加手势的控件上,截图如下2.给我们拖出来的手势添加一个回调事件,和Button的回调事件没什么区别,和在回调方法中添加实现业务逻辑就够了,截图如下: 二、用纯代码添加手势识别使用storyboard可以大大简化我们的操作,但是纯代码方法还是要知道的,就像在Dreamwear中编辑网页一样(当然,storyboardDreamwear的拖拽功能要比Dreamwear强大很多),用纯代码更灵活,更容易维护。但是使用storyboard可以减少我们的工作量,这两者必须配合使用才能大大提高我们的开发效率。个人感觉还是用storyboard架起framework(Controller之间的关系)比较好,小东西用纯代码敲出来比较好。下面是如何用纯代码向我们的控件添加手势识别。1.添加点击手势的初始化代码(TapGestureRecognizer)TapGestureRecongnizer的代码如下:1//新建一个点击手势2UITapGestureRecognizer*tapGesture=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tapGesture:)];3//设置点击次数和Tap手指索引4tapGesture.numberOfTapsRequired=1;//点击次数5tapGesture.numberOfTouchesRequired=1;//点击手指索引6[self.viewaddGestureRecognizer:tapGesture];在回调方法中添加相应的业务逻辑:1//点击手势触发方法2-(void)tapGesture:(id)sender3{4//点击后要做的事情5}2.长按手势(LongPressGestureRecognizer)初始化代码://添加长按手势2UILongPressGestureRecognizer*longPressGesture=[[UILongPressGestureRecognizeralloc]initWithTarget:selfaction:@selector(longPressGesture:)];3//设置长按时间4longPressGesture.minimumPressDuration=0.5;//(2秒)5[self.viewaddGestureRecognizer:longPressGesture];在相应的回调方法中添加相应的方法(手势开始时执行):1//长按手势的触发方法2-(void)longPressGesture:(id)sender3{4UILongPressGestureRecognizer*longPress=sender;5if(longPress.state==UIGestureRecognizerStateBegan)6{7UIAlertView*alter=[[UIAlertViewalloc]initWithTitle:@"提示"消息:@"长按触发"delegate:nilcancelButtonTitle:@"Cancel"otherButtonTitles:nil];8[altershow];9}0}代码说明:手势常用状态如下Start:UIGestureRecognizerStateBeganChange:UIGestureRecognizerStateChangedEnd:UIGestureRecognizerStateEndedCancel:UIGestureRecognizerStateCancelled3滑动手势失败:UIGestureRecognizerState.(SwipeGestureRecognizer)初始化滑动手势时,必须指定滑动方向,如果要添加多个滑动方向,则必须添加多个滑动手势,但回调是同一个方法。添加一个滑动手势,一个向左一个向右,代码如下:1//添加一个滑动手势2UISwipeGestureRecognizer*swipeGesture=[[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(swipeGesture:)];3//设置滑动的方向4swipeGesture.direction=UISwipeGestureRecognizerDirectionRight;//默认向右5[self.viewaddGestureRecognizer:swipeGesture];67//添加滑动手势8UISwipeGestureRecognizer*swipeGestureLeft=[[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:9wielction:@wielction设置滑动的方向10swipeGestureLeft.direction=UISwipeGestureRecognizerDirectionLeft;//默认向右11[self.viewaddGestureRecognizer:swipeGestureLeft];回调方法如下:1//滑动手势触发方法2-(void)swipeGesture:(id)sender3{4UISwipeGestureRecognizer*swipe=sender;5if(swipe.direction==UISwipeGestureRecognizerDirectionLeft)6{7//向左滑动做8}9if(swipe.direction==UISwipeGestureRecognizerDirectionRight)10{11//向右滑动做12}13}144.捏合手势(PinchGestureRecognizer)捏合手势初始化//添加捏合手势2UIPinchGestureRecognizer*pinchGesture=[[UIPinchGestureRecognizeralloc]initWithTarget:selfaction:@selector(捏手势:)];3[self.viewaddGestureRecognizer:pinchGesture];触发捏合手势的方法(放大或缩小图片):1////捏合手势触发方法2-(void)pinchGesture:(id)sender3{4UIPinchGestureRecognizer*gesture=sender;56//手势变化时7if(gesture.state==UIGestureRecognizerStateChanged)8{9//缩放手势中scale属性记录的缩放比例10_imageView.transform=CGAffineTransformMakeScale(gesture.scale,gesture.scale);11}1213//结束后恢复14if(gesture.state==UIGestureRecognizerStateEnded)15{16[UIViewanimateWithDuration:0.5animations:^{17_imageView.transform=CGAffineTransformIdentity;//取消所有变换18}];19}20}5。拖动手势(PanGestureRecognizer)初始化拖动手势//添加拖动手势2UIPanGestureRecognizer*panGesture=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(panGesture:)];3[self.viewaddGestureRecognizer:panGesture];methodtododraggesture(通过translationInView获取移动点,类似TouchesMoved方法)1//拖动手势2-(void)panGesture:(id)sender3{4UIPanGestureRecognizer*panGesture=sender;56CGPointmovePoint=[panGesturetranslationInView:self.view];78//做你想做的9}6.旋转手势(RotationGestureRecognizer)初始化旋转手势//添加旋转手势2UIRotationGestureRecognizer*rotationGesture=[[UIRotationGestureRecognizeralloc]initWithTarget:selfaction:@selector(rotationGesture:)];3[self.viewaddGestureRecognizer:rotationGesture];旋转手势调用方法:复制代码1//旋转手势2-(void)rotationGesture:(id)sender3{45UIRotationGestureRecognizer*gesture=sender;67if(gesture.state==UIGestureRecognizerStateChanged)8{9_imageView.transform=CGAffineTransformMakeRotation(gesture.rotation);10}1112if(gesture.state==UIGestureDucognizerStateEnded)13{animateUIView1[ithimateW:^{16_imageView.transform=CGAffineTransformIdentity;//取消变换17}];18}1920}