您的位置:首页 > 产品设计 > UI/UE

RESideMenu UIScrollView冲突

2015-11-15 20:27 489 查看
最近的项目使用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函数,上下那两句是为了消除编译时候的警告。这个方法的滑动效果很好,不知道正不正规。还有很多东西学习,加油。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息