UIScrollView原理

一、原理:

scrollView自帶一個PanGesture滑動手勢,滑動時修改scrollview的bounds.y,實現(xiàn)子視圖有滑動效果。
參考:http://www.itdecent.cn/p/964313cfbdaa

二、觸摸事件打斷

根據(jù)《事件傳遞 響應(yīng)鏈》所知,自帶的滑動手勢會打斷響應(yīng)鏈中視圖的touch方法,可以通過手勢屬性cancelsTouchesInView=NO ,讓這個手勢不打斷響應(yīng)者的touch方法。
參考:http://www.itdecent.cn/p/b0884faae603

三、scrollView的一個機(jī)制

scrollView的屬性delaysContentTouches 和 canCancelContentTouches控制事件響應(yīng)交給scrollview子視圖還是scrollView的手勢。

從你的手指touch屏幕開始,scrollView開始一個timer,如果:

  • 150ms內(nèi)如果你的手指沒有任何動作,消息就會傳給subView。
  • 150ms內(nèi)手指有明顯的滑動(一個swipe動作),scrollView就會滾動,消息不會傳給subView。
  • 150ms內(nèi)手指沒有滑動,scrollView將消息傳給subView,但是之后手指開始滑動,scrollView傳送touchesCancelled消息給subView,然后開始滾動。
    delaysContentTouches:默認(rèn)值為YES。如果設(shè)置為NO,則會立即把事件傳遞給subView。canCancelContentTouches:默認(rèn)為YES,如果設(shè)置為NO,這消息一旦傳遞給subView,這scroll事件不會再發(fā)生。
    參考:http://www.itdecent.cn/p/2b171f6153ad

四、scrollview和子視圖事件沖突

canCancelContentTouches用來控制scrollview的全局沖突設(shè)置,以下兩個scrollview方法用來分開控制scrollview與子視圖事件沖突


下面這個函數(shù)的功能是判斷是否可以把touch 事件傳遞給子視圖,即在他上面的視圖。當(dāng)返回是yes 的時候就表示可以,就當(dāng)點擊子視圖view 的時候停止響應(yīng)scroll事件,改而響應(yīng)子視圖的touch 事件,當(dāng)為no 時則拒絕子視圖響應(yīng),執(zhí)行父視圖的touch 事件

//scrollview的delaysContentTouches=NO時,會立刻調(diào)用這個方法,看是否滾動scrollview,用來控制子視圖是否響應(yīng)touch事件
- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view{
}


用來具體控制某個scrollview子視圖是否打斷touch,不打斷子視圖touch意味著觸摸在這個子視圖時,scrollview不會滑動

當(dāng)UIScrollView將touch事件交給子view后,當(dāng)手指發(fā)生滑動時,調(diào)用此方法,假如返回NO,則將touch事件交給view,如果返回YES,則交給UIScrollView處理,產(chǎn)生滑動。(但是前提是UIScrollView的canCancelContentTouches屬性是YES才會調(diào)用這個方法,只要不是UIControll的子類,這個屬性默認(rèn)是YES。)

- (BOOL)touchesShouldCancelInContentView:(UIView *)view{




return NO;不打斷子視圖touch,scrollview不滑動
return YES;打斷子視圖touch,scrollview滑動}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容