天天看点

RESideMenu UIScrollView冲突

最近的项目使用RESideMenu,侧滑弹出菜单,但是由于主页用的是UIScrollView,导致往右边用手指滑动侧滑的时候,不能打开侧滑菜单,由于UIScrollView先响应了UIPanGestureRecognizer手势,导致RESideMenu的手势失效,搜索了资料,暂时找到了两种解决方法。

第一种就是重写UIScrollView的panGestureRecognizer的代理方法,就是给UIScrollView增加一个分类。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
    {
        id delegate = otherGestureRecognizer.delegate;
        if([delegate isKindOfClass:[RootViewController class]])
        {
            return YES;
        }
        return NO;
    }
    else
    {
        return  NO;
    }
}
           

但是这种方法只能响应从屏幕边缘的滑动手势。

第二种是给UIScrollView的panGestureRecognizer的属性增加一个tagrget,

[self.scrollView.panGestureRecognizeraddTarget:selfaction:@selector(scrollHandlePan:)];

这个手势增加自定义的响应方法,根据方法的签名,是可以增加多个响应方法的,以前不知道。以下代码是UIGestureRecognizer类里面添加响应方法的说明。

- (void)addTarget:(id)target action:(SEL)action;    // add a target/action pair. you can call this multiple times to specify multiple target/actions
           

后面的注释说明可以增加多对响应方法。以前一直不知道,哈哈学习了。

步骤如下,给你自己的变量scrollview增加监听响应的方法:

[self.scrollView.panGestureRecognizer addTarget:self action:@selector(scrollHandlePan:)];
           
-(void)scrollHandlePan:(UIPanGestureRecognizer*) panParam
{
    CGPoint offset = [panParam translationInView:self.scrollView];
    JJWLog(@"scrollHandlePan--------- %@",NSStringFromCGPoint(offset));
    if(self.currentPage == 0)
    {
        if(offset.x > 0)
        {
            SEL selector = NSSelectorFromString(@"panGestureRecognized:");
            RESideMenu *rootVC = [self sideMenuViewController];
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            [rootVC performSelector:selector withObject:panParam];
#pragma clang diagnostic pop
            [rootVC performSelector:selector withObject:panParam];
        }
    }
}
           

上面的逻辑就是判断scrollview是在哪一页,只有是在第0页,而且是向右滑动时,才能侧滑拉出侧滑菜单。由于RESideMenu的侧滑手势的响应函数手势私有的,所以用了pefrmSelector函数,上下那两句是为了消除编译时候的警告。这个方法的滑动效果很好,不知道正不正规。还有很多东西学习,加油。。。