MMDrawerController和UITableView的手勢衝突

MMDrawerController做爲一個在Github上超過6k Star的熱門項目,估計很多朋友都有用過。ide

MMDrawerController的使用過程當中,不免遇到一下手勢衝突問題,這裏集中記錄一下本人的解決辦法。code

MMOpenDrawerGestureModeAll形成UITableView不能側滑打開cell編輯功能的問題

這個問題解決須要兩個步驟,首先,繼承MMDrawerController寫一個子類,而後在子類中實現UIPanGesture的繼承

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

這個回調,以下it

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        UIPanGestureRecognizer* pan = (UIPanGestureRecognizer*)gestureRecognizer;
        CGPoint p = [pan translationInView:pan.view];

        if(fabs(p.y)<fabs(p.x) && p.x > 0)
        {
            return NO;
        }
        
        return fabs(p.y)<fabs(p.x);
    }
    return YES;
}

if(fabs(p.y)<fabs(p.x) && p.x > 0)判斷滑屏方向爲橫向向右時,return NO,禁止tableView上下滾動,若是去掉這段,則在向右打開過程當中同時tableView還能夠上下滑動。io

而後用fabs(p.y)<fabs(p.x)判斷是否爲向左的水平滑動,我這裏只使用了左邊側滑菜單,因此向左劃時候,return YES,保證了tableView的cell編輯功能順利開啓。table

MMOpenDrawerGestureModeAll(全打開邊欄方式)形成中心VC的UITableView不能點擊的問題

一樣的思路,在繼承MMDrawerController的子類中添加以下代碼class

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]])
    {
        if(self.openSide == MMDrawerSideNone)
        {
            return NO;
        }
    }
    return [super gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch];
}

這裏解決的原理也很簡單,在邊欄爲關閉狀態的時候,禁止MMDrawerController的pan手勢接受tap類型的touch。原理

UITableViewCell 編輯狀態下,右滑關閉時打開左側欄的問題

這個問題換一個思路解決,在tableView開始編輯和中止編輯的回調中,調整MMDrawerController的菜單開啓屬性。im

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.mm_drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeNone;
}

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.mm_drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
}

完美解決問題。項目

若有其餘問題歡迎留言討論。

相關文章
相關標籤/搜索