MMDrawerController: определение действия закрытия меню или жеста смахивания

Я хочу определить, когда меню закрыто. Я нашел этот SO решенным вопросом. В комментариях к принятому ответу говорят, что этот метод:

-(void)setGestureCompletionBlock:(void(^)(MMDrawerController * drawerController, UIGestureRecognizer * gesture))gestureCompletionBlock;

должен находиться в App delegate, чтобы получать уведомления о закрытии меню. Я поместил эту функцию в свой делегат приложения, и в ее реализации я сделал NSLog(@"menu closed");, но в моей консоли ничего не печатается, и функция не запускается, когда я закрываю меню.

Может кто-нибудь объяснить мне, пожалуйста, как я могу определить, что меню закрыто? (На основе данного ответа или если у вас есть другой)

Изменить:

В раскадровке у меня есть UINavigationController, связанный с UIViewController, имеющим тип MMDrawerController (myVCMMdrawerController), затем у меня также есть myCenterVC, leftVC и rightVC. В myVCMMdrawerController viewDidLoad я делаю следующее:

MyCenterVC * centerVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"myCenterVC"];
    centerVC.drawerController = self;

    LeftVC * leftVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"leftVC"];
    leftVC.drawerController = self;

    self.centerViewController = centerVC;
    self.leftDrawerViewController = leftVC;


    self.showsShadow = false;
    //[self setMaximumLeftDrawerWidth:[UIScreen mainScreen].bounds.size.width animated: true completion: nil];

    //enable gesture
    self.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
    self.closeDrawerGestureModeMask = MMCloseDrawerGestureModeAll;
    [self closeDrawerAnimated:NO completion:nil];

В myCenterVC я делаю действия по отображению меню в IBActions так:

[self.drawerController toggleDrawerSide:MMDrawerSideLeft animated:true completion:nil];

person Ne AS    schedule 03.07.2017    source источник


Ответы (1)


вот код, который работает для меня:

Свифт 3.0+

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let leftDrawer = UIViewController()
    leftDrawer.view.backgroundColor = UIColor.red
    let centerDrawer = UIViewController()
    centerDrawer.view.backgroundColor = UIColor.green

let mainContainer = MMDrawerController(center: centerDrawer, leftDrawerViewController: leftDrawer)

mainContainer?.openDrawerGestureModeMask = .panningCenterView
mainContainer?.closeDrawerGestureModeMask = .panningCenterView

mainContainer?.setGestureCompletionBlock({ (drawer, gesture) in
    if drawer?.openSide != .left {
        print("Drawer Closed")
    }else {
        print("Drawer Opened")
    }
})

window?.rootViewController = mainContainer
window?.makeKeyAndVisible()

return true

}

Возможно, вам придется убедиться, что вы установили

mainContainer?.openDrawerGestureModeMask = .panningCenterView
mainContainer?.closeDrawerGestureModeMask = .panningCenterView

и проверьте, закрыто ли drawer's openSide is left иначе.

Цель-C

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    UIViewController *leftDrawer = [[UIViewController alloc] init];
    [[leftDrawer view] setBackgroundColor:[UIColor redColor]];
    UIViewController *centerDrawer = [[UIViewController alloc] init];
    [[centerDrawer view] setBackgroundColor:[UIColor greenColor]];

    MMDrawerController *mainDrawer = [[MMDrawerController alloc] initWithCenterViewController:centerDrawer leftDrawerViewController:leftDrawer];
    mainDrawer.openDrawerGestureModeMask = MMOpenDrawerGestureModePanningCenterView;
    mainDrawer.closeDrawerGestureModeMask = MMOpenDrawerGestureModePanningCenterView;

    [mainDrawer setGestureCompletionBlock:^(MMDrawerController *drawerController, UIGestureRecognizer *gesture) {
        if (drawerController.openSide != MMDrawerSideLeft) {
            NSLog(@"Drawer Closed");
        }else{
            NSLog(@"Drawer Opened");
        }
    }];

    self.window.rootViewController = mainDrawer;
    [self.window makeKeyAndVisible];

    return YES;
}
person Lawrence Tan    schedule 03.07.2017
comment
не могли бы вы предоставить версию objective-c? - person Ne AS; 03.07.2017
comment
Благодарю вас! Что, если я создам ящик в UIViewController? В делегате приложения я создал MMDrawerController *mainDrawer в качестве свойства, затем в своем UIViewController я установил этот mainDrawer с тем, который находится в UIViewController. Но кажется, что mainDrawer не установлен. У вас есть идея об этой проблеме, пожалуйста? Спасибо еще раз - person Ne AS; 04.07.2017
comment
Можете ли вы предоставить фрагменты кода того, что вы делаете, чтобы помочь мне понять проблему, пожалуйста? @Llg - person Lawrence Tan; 04.07.2017
comment
@Llg есть ли веская причина, по которой вы хотите установить его в другом контроллере uiview? это обычная практика инициализировать и устанавливать одновременно, когда контроллер ящика загружается в память. - person Lawrence Tan; 04.07.2017
comment
Спасибо, Лоуренс Тан. На самом деле я искал ту же задачу. И это прекрасно работает. - person RajibTheKing; 24.10.2017