天天看點

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