天天看點

iOS開發 UIScrollView加UIPanGestureRecognizer手勢沖突

用JTCalendar插件時,月曆的view是JTHorizontalCalendarView類,是UIScrollView的子類,可以左右滾動切換月曆。但是應用中需要響應上下滾動,是以我再加了UIPanGestureRecognizer手勢,結果就和UIScrollView沖突了:我加的手勢有效果,但是JTHorizontalCalendarView就不再響應手勢,就不能左右滾動了。網上找到了下面這篇文章終于優雅的解決了問題。下面這篇文章作者遇到的問題是UIScrollView上疊加了一個控件,而我的是同一個控件上再加一個手勢,是以和我的問題略微有點不一樣,但是解決方法完全是相同的。

UIScrollView子控件加UIPanGestureRecognizer拖動手勢

問題描述:橫向UIScrollView裡面的子控件,我使用了UIPanGestureRecognizer來實作拖動,但是發現UIScrollView無法響應滾動事件,因為scroll裡面布滿了我放的控件,是以不能響應。如果先讓scroll響應

[panGestureRecognizer requireGestureRecognizerToFail:sroll.panGestureRecognizer]//先處理scroll
           

發現,我添加的手勢又不響應了,因為sroll滾動每次都成功。

解決辦法:後來在 棧溢出 問答平台找到了一個沒有采納的答案解決了問題,使用手勢代理,通過

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
           

來解決

這個方法是用來處理多手勢共存的,傳回NO則響應一個手勢,傳回YES為同時響應,我的處理方法是,判斷目前gestureRecognizer是否是panGestureRecognizer,然後判斷方向,如果為上下方向則傳回NO,則scroll不響應,否則都響應,問題完美解決。

當然拖動手勢沒法直接擷取方向需要通過

CGPoint translation = [(UIPanGestureRecognizer*)gestureRecognizer translationInView:self];
           

來獲得,如果translation.y的絕對值大于translation.x的絕對值就可以看成是上下方向。

原文連結:https://blog.csdn.net/assholeu/article/details/16821151

繼續閱讀