最近的項目使用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函數,上下那兩句是為了消除編譯時候的警告。這個方法的滑動效果很好,不知道正不正規。還有很多東西學習,加油。。。