天天看点

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