SWRevealViewController:在显示后视图时删除前视图上的交互

use*_*356 13 user-interaction uiviewcontroller ios swrevealviewcontroller

我需要在显示后视图时禁用前视图上的用户交互.发现其他人问同样的事情,但无法真正理解在哪里或如何实现我见过的代码.

例如:我从链接中找到了此代码,

- (void)revealController:(SWRevealViewController *)revealController 
      willMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}

- (void)revealController:(SWRevealViewController *)revealController 
       didMoveToPosition:(FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    } 
}
Run Code Online (Sandbox Code Playgroud)

还发现其他一些链接

我有这个代码,但不确定插入此代码的正确位置.我已经尝试在我的前/后视图中添加它,并且在SWRevealViewController方法中也没有成功

感谢有人能指出我正确的方向.

小智 52

我最近提出了一个我想分享的解决方案(抱歉,如果它迟到了2个月).

要在菜单打开时禁用前视图上的用户交互,我在MenuViewController上添加了以下代码:

在viewWillAppear上:

[self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
Run Code Online (Sandbox Code Playgroud)

并在viewWillDisappear上:

[self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

这将禁用前视图控制器上的所有用户交互,这意味着关闭菜单的滑动/轻击手势也将被禁用.

现在,我创建了一个ParentViewController,并使所有视图控制器(菜单项)成为它的子类.

在我的viewDidLoad上,我输入以下代码:

SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];
Run Code Online (Sandbox Code Playgroud)

如果此时运行您的应用程序,则可能会出现Tap Gesture工作(点击前视图将关闭菜单),但不是Pan Gesture.我不确定为什么会这样,但是为了使滑动手势能够关闭你的菜单,在MenuViewController中添加以下代码:

在viewWillAppear上:

[self.revealViewController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
Run Code Online (Sandbox Code Playgroud)

总结一下,这就是你需要的:

在您的MenuViewController上:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
    [self.revealViewController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
}
Run Code Online (Sandbox Code Playgroud)

在菜单项的视图控制器上(您可以为所有菜单项创建一个ParentViewController):

-(void)viewDidLoad {
    [super viewDidLoad];

    SWRevealViewController *revealController = [self revealViewController];
    [revealController panGestureRecognizer];
    [revealController tapGestureRecognizer];
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


xun*_*xun 13

我已经使用另一种方法来实现相同的结果,不确定它是否有帮助.

将SWRevealViewControllerDelegate分配给AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    SWRevealViewController* reveal = (SWRevealViewController*)self.window.rootViewController;
    reveal.delegate = self;

    // other bootstrapping code
}
Run Code Online (Sandbox Code Playgroud)

然后在委托方法-(void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position中如下:

-(void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position
{
    if(position == FrontViewPositionLeft){
        [revealController.frontViewController.view setUserInteractionEnabled:YES];
        [revealController.frontViewController.revealViewController tapGestureRecognizer];
    }else{
        [revealController.frontViewController.view setUserInteractionEnabled:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:添加此行[revealController.frontViewController.revealViewController tapGestureRecognizer]以在点击frontviewcontroller时关闭显示的控制器


Ash*_*hok 5

Swift版本到@hardluckbaby答案:

在MenuViewController(后视图控制器)中:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    self.revealViewController().frontViewController.view.userInteractionEnabled = false
    self.revealViewController().view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    self.revealViewController().frontViewController.view.userInteractionEnabled = true
}
Run Code Online (Sandbox Code Playgroud)

在FrontViewController中(您可以像@hardluckbaby所说的那样为所有前视图控制器创建一个ParentViewController):

override func viewDidLoad() {
    super.viewDidLoad()

    if let revealController = self.revealViewController() {
        revealController.panGestureRecognizer()
        revealController.tapGestureRecognizer()
    }
}
Run Code Online (Sandbox Code Playgroud)