如何移除特定UIView上RESideMenu的手势识别器
你之前的代码没生效,核心原因是RESideMenu的手势识别器根本不在你当前控制器的self.view上——它的手势通常绑定在RESideMenu自身的容器视图(或侧边菜单的父视图)上,所以遍历当前view的手势自然找不到它们。
下面给你两种可行的解决方案,按需选择:
方案一:精准移除RESideMenu的内置手势
RESideMenu本身暴露了常用的手势属性,比如平移手势panGestureRecognizer和点击手势tapGestureRecognizer,你可以直接获取这些手势并移除:
// 先拿到RESideMenu的实例(假设你的根控制器是RESideMenu) RESideMenu *sideMenu = (RESideMenu *)[UIApplication sharedApplication].keyWindow.rootViewController; // 移除平移手势 if (sideMenu.panGestureRecognizer) { [sideMenu.view removeGestureRecognizer:sideMenu.panGestureRecognizer]; } // 移除点击手势(如果不需要的话) if (sideMenu.tapGestureRecognizer) { [sideMenu.view removeGestureRecognizer:sideMenu.tapGestureRecognizer]; }
方案二:遍历移除RESideMenu所有视图的手势
如果担心还有其他隐藏的手势,可以递归遍历RESideMenu的所有视图及子视图,把所有手势都移除:
// 递归移除视图及其子视图的所有手势 - (void)removeAllGesturesFromView:(UIView *)targetView { // 遍历当前视图的手势,注意要copy一份再遍历,避免数组变化导致崩溃 for (UIGestureRecognizer *gesture in [targetView.gestureRecognizers copy]) { [targetView removeGestureRecognizer:gesture]; } // 递归处理子视图 for (UIView *subview in targetView.subviews) { [self removeAllGesturesFromView:subview]; } } // 调用方法:拿到RESideMenu实例后传入它的view RESideMenu *sideMenu = (RESideMenu *)[UIApplication sharedApplication].keyWindow.rootViewController; [self removeAllGesturesFromView:sideMenu.view];
额外建议:临时禁用而非永久移除
如果你只是想在特定UIViewController显示期间禁用侧滑手势,而不是彻底移除,建议直接禁用手势的enabled属性,这样后续还能恢复:
// 在目标控制器的viewWillAppear中禁用 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; RESideMenu *sideMenu = (RESideMenu *)[UIApplication sharedApplication].keyWindow.rootViewController; sideMenu.panGestureRecognizer.enabled = NO; sideMenu.tapGestureRecognizer.enabled = NO; } // 在viewWillDisappear中恢复 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; RESideMenu *sideMenu = (RESideMenu *)[UIApplication sharedApplication].keyWindow.rootViewController; sideMenu.panGestureRecognizer.enabled = YES; sideMenu.tapGestureRecognizer.enabled = YES; }
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

