iOS實現ScrollView中子控制元件(Button,自定義View)的觸控事件響應

?發表於2019-02-13

最近要做個資訊登記介面,在scrollView中新增了多個button和一個自定義的view(畫板)來實現簽名效果,畫板中實現了touchBegin,touchMove等觸控事件方法。為了使button能響應scrollView的滑動觸控事件在網上找了很多資料,結果要麼就是手指放在button上能滑動,但放在畫板上就不能畫畫或者能畫畫但button不能滑動,沒有兩全其美的方法,摸索了很久最終找到了解決方法。先看圖。

scrollView滑動.gif

先說下常見的方法self.scrollView.panGestureRecognizer.delaysTouchesBegan = YES;設定scrollView的延遲接收點選觸控事件,此時button能實現滑動和點選效果,但由於畫板需要接收點選觸控事件才能開始畫,故需要先長按,達不到我們要的效果,故pass。

scrollView1.gif
另外一種方法self.scrollView.delaysContentTouches = YES;此時畫板畫畫沒有延遲,但button無法識別滑動觸控事件,滑動時會直接實現點選。

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,如果是則讓其不響應觸控事件,由此過濾掉除了點選以外的所有觸控事件

scrollView3.gif

demo請點選SimonYHB

相關文章