最近要作個信息登記界面,在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