神刀安全网

iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应

最近要做个信息登记界面,在scrollView中添加了多个button和一个自定义的view(画板)来实现签名效果,画板中实现了touchBegin,touchMove等触摸事件方法。为了使button能响应scrollView的滑动触摸事件在网上找了很多资料,结果要么就是手指放在button上能滑动,但放在画板上就不能画画或者能画画但button不能滑动,没有两全其美的方法,摸索了很久最终找到了解决方法。先看图。

iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应
scrollView滑动.gif

先说下常见的方法self.scrollView.panGestureRecognizer.delaysTouchesBegan = YES;设置scrollView的延迟接收点击触摸事件,此时button能实现滑动和点击效果,但由于画板需要接收点击触摸事件才能开始画,故需要先长按,达不到我们要的效果,故pass。

iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应
scrollView1.gif

另外一种方法self.scrollView.delaysContentTouches = YES;此时画板画画没有延迟,但button无法识别滑动触摸事件,滑动时会直接实现点击。

iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应
scrollView2.gif

解决方法

既要能实现button点击效果,又要实现画板画画无延迟,那么解决办法来啦~
首先要设置scrollView的两个属性

    self.scrollView.canCancelContentTouches = YES;     self.scrollView.delaysContentTouches = NO;
  • delaysContentTouches表示scrollView的子控件响应触摸事件是否有延迟,NO表示立即响应,YES表示延迟响应;
  • canCancelContentTouches与delaysContentTouches相反,假如你设置canCancelContentTouches为YES,那么当你在UIScrollView上面放置任何子视图的时候,在子视图上移动手指的时候,UIScrollView会给子视图发送touchCancel的消息,既不响应触摸事件。而如果该属性设置为NO,ScrollView本身不 处理这个消息,全部交给子视图处理。

接着创建一个scrollView的分类,实现两个与上面属性配套的方法

#import "MainScrollView.h" #import "HBSignView.h"  //自定义的view,实现画板功能 @implementation MainScrollView //当设置canCancelContentTouches=YES时,触摸事件响应前会调用该方法 -(BOOL)touchesShouldCancelInContentView:(UIView *)view{     if ([view isKindOfClass:[UIButton class]]) {          return YES;     }     return [super touchesShouldCancelInContentView:view]; } //在触摸事件开始相应前调用 - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {      if ([view isKindOfClass:[HBSignView class]]||[view isKindOfClass:[UIButton class]]) {         return YES;     }     return NO; }

当设置canCancelContentTouches=YES时,除了touchBegin以外的所有触摸事件响应前会调用touchesShouldCancelInContentView:返回YES表示子视图不响应触摸事件,返回NO表示由子视图来处理触摸事件。而touchesShouldBegin:withEvent:inContentView:在每次触摸事件开始前都会调用,而且先于touchesShouldCancelInContentView:
于是先在touchesShouldBegin:withEvent:inContentView:判断当子视图是button或者是画板时,就由子视图自己处理触摸事件;接着在touchesShouldCancelInContentView:方法中,判断子视图是否是button,如果是则让其不响应触摸事件,由此过滤掉除了点击以外的所有触摸事件

iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应
scrollView3.gif

代码比较简单就没传demo了,需要的可以给我留言O(∩_∩)O

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址