MMDrawerControllerのジェスチャー競合使用の問題

5818 ワード

1.MMDrawerControllerサードパーティファイルをローカルにpodsする
2.コントローラの初期化
   //1、      

    UIViewController *centerVC = [[MainViewController alloc]init];
    
        UIViewController *leftVC = [[LeftViewController alloc]init];
        //2、        
        UINavigationController *centerNvaVC = [[UINavigationController alloc]initWithRootViewController:centerVC];
        UINavigationController *leftNvaVC = [[UINavigationController alloc]initWithRootViewController:leftVC];
    
        //3、  MMDrawerController
        self.drawerController = [[MMDrawerController alloc]initWithCenterViewController:centerNvaVC leftDrawerViewController:leftNvaVC rightDrawerViewController:nil];
    
        //4、    /       
        self.drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
        self.drawerController.closeDrawerGestureModeMask =MMOpenDrawerGestureModeAll;
        //5、             
        self.drawerController.maximumLeftDrawerWidth = 200.0;
        //    self.drawerController.maximumRightDrawerWidth = 200.0;
    //6、     、        、    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
    [self.window setRootViewController:self.drawerController];
    [self.window makeKeyAndVisible];


3、使用したViewControllerで設定
- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    //                        ,        ,       
    
    [self.mm_drawerController setOpenDrawerGestureModeMask:MMOpenDrawerGestureModeAll];
    [self.mm_drawerController setCloseDrawerGestureModeMask:MMCloseDrawerGestureModeAll];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ground"]];
    self.title = @"  ";
    
    //1、        
    UIImage *Personal_center = [UIImage imageNamed:@"Group 3 Copy"];
    UIButton *LeftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Personal_center.size.width, Personal_center.size.width)];
    [LeftButton setBackgroundImage:Personal_center forState:UIControlStateNormal];
    LeftButton.layer.masksToBounds = YES;
    [LeftButton addTarget:self action:@selector(leftBtn) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem* leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:LeftButton];

    self.navigationItem.leftBarButtonItem = leftBarButton;

//    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"Personal center"] style:UIBarButtonItemStylePlain target:self action:@selector(leftBtn)];
    
    //         UIBarButtonItem   
    //    self.navigationItem.leftBarButtonItem = [[MMDrawerBarButtonItem alloc]initWithTarget:self action:@selector(leftBtn)];
    //    self.navigationItem.rightBarButtonItem = [[MMDrawerBarButtonItem alloc]initWithTarget:self action:@selector(rightBtn)];
    
    
    //2、      
    UITapGestureRecognizer * doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
    //2.1、  
    [doubleTap setNumberOfTapsRequired:2];
    [self.view addGestureRecognizer:doubleTap];
    
    //3、          
    UITapGestureRecognizer * twoFingerDoubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerDoubleTap:)];
    //3.1、  
    [twoFingerDoubleTap setNumberOfTapsRequired:2];
    //3.2、           
    [twoFingerDoubleTap setNumberOfTouchesRequired:2];
    [self.view addGestureRecognizer:twoFingerDoubleTap];
    
    
    //       
    [self.navigationController.navigationBar setBarTintColor:[UIColor blackColor]];
    
    //         
    
    [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName,nil]];
    
    [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
    
//          
    [self createUI];
    
}
-(void)leftBtn{
    //                AppDelegate      MMDrawerController  ,           ,      ,     (    ,        )6
    [self.mm_drawerController toggleDrawerSide:MMDrawerSideLeft animated:YES completion:nil];

}

/**
 *                
 */
-(void)doubleTap:(UITapGestureRecognizer*)gesture{
    [self.mm_drawerController bouncePreviewForDrawerSide:MMDrawerSideLeft completion:nil];
}

/**
 *                 
 */
-(void)twoFingerDoubleTap:(UITapGestureRecognizer*)gesture{
    [self.mm_drawerController bouncePreviewForDrawerSide:MMDrawerSideRight completion:nil];
}



-(void)viewDidDisappear:(BOOL)animated
{
    
    [super viewDidDisappear:animated];
    
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    [self.mm_drawerController setOpenDrawerGestureModeMask:MMOpenDrawerGestureModeNone];
    [self.mm_drawerController setCloseDrawerGestureModeMask:MMCloseDrawerGestureModeNone];
}

MMDrawerControllerジェスチャーと競合するシステムジェスチャーを別のビューで開く(前のページに戻る)
同じRootViewControllerから継承され、ここに書くことができます.
#import "MMDrawerController.h"
#import "UIViewController+MMDrawerController.h"
-(void)viewWillAppear:(BOOL)animated
{
    self.mm_drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeNone;
    self.mm_drawerController.closeDrawerGestureModeMask = MMCloseDrawerGestureModeNone;
    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES ;
}


これでMMDrawerControllerがシステムジェスチャーと衝突する問題を完璧に解決しました.