1. 程式人生 > >iOS開發 UIScrollView加UIPanGestureRecognizer手勢衝突

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的絕對值就可以看成是上下方向。