最近要作个信息登记界面,在scrollView中添加了多个button和一个自定义的view(画板)来实现签名效果,画板中实现了touchBegin,touchMove等触摸事件方法。为了使button能响应scrollView的滑动触摸事件在网上找了不少资料,结果要么就是手指放在button上能滑动,但放在画板上就不能画画或者能画画但button不能滑动,没有一箭双鵰的方法,摸索了好久最终找到了解决方法。先看图。git
先说下常见的方法self.scrollView.panGestureRecognizer.delaysTouchesBegan = YES;
设置scrollView的延迟接收点击触摸事件,此时button能实现滑动和点击效果,但因为画板须要接收点击触摸事件才能开始画,故须要先长按,达不到咱们要的效果,故pass。 github
self.scrollView.delaysContentTouches = YES;
此时画板画画没有延迟,但button没法识别滑动触摸事件,滑动时会直接实现点击。
##解决方法 既要能实现button点击效果,又要实现画板画画无延迟,那么解决办法来啦~ 首先要设置scrollView的两个属性bash
self.scrollView.canCancelContentTouches = YES;
self.scrollView.delaysContentTouches = NO;
复制代码
接着建立一个scrollView的分类,实现两个与上面属性配套的方法ui
#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,若是是则让其不响应触摸事件,由此过滤掉除了点击之外的全部触摸事件spa
demo请点击SimonYHB3d