如何在 RearViewController 的视图处于活动状态时禁用 front ViewController 的视图 Swift 3.0 中的 SWRevealViewController

How to disable front ViewController's view when RearViewController's view is active SWRevealViewController in Swift 3.0

如何禁用用户与前视图控制器的交互 - 即在我的例子中,当显示后菜单时使用 class ViewController。使用当前代码,当显示后菜单时,bookCleaningButton 不会被禁用。

import UIKit
class ViewController: UIViewController, SWRevealViewControllerDelegate {

  @IBOutlet weak var menuButton: UIBarButtonItem!
  @IBOutlet weak var bookCleaningButton: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()
      self.revealViewController().rearViewRevealWidth = self.view.frame.width - 80

 //revela the menu if it is not nil
    if self.revealViewController() != nil {
        self.revealViewController().delegate = self
         menuButton.target = self.revealViewController()
           menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
         self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()   
    }
  }


func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {
    if revealController.frontViewPosition == FrontViewPosition.left {
        self.view.isUserInteractionEnabled = false
    }
    else {
        self.view.isUserInteractionEnabled = true
     }
  }  
}

您应该在菜单视图控制器中处理它。显示视图控制器可以访问 frontViewController,并且 属性 可用于将 userInteractionEnabled 设置为 false

因此,在您的菜单视图控制器中,在 viewWillAppear 方法中编写此代码:

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.revealViewController().view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    self.revealViewController().frontViewController.revealViewController().tapGestureRecognizer()
    self.revealViewController().frontViewController.view.isUserInteractionEnabled = false
}

并且在同一个 Menu view Controller 的 viewWillDisappear 方法中添加以下代码:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    self.revealViewController().frontViewController.view.isUserInteractionEnabled = true
}

以上代码还添加了其他手势,但这些可以是可选的。主要动作发生在这两行:

self.revealViewController().frontViewController.view.isUserInteractionEnabled = false

self.revealViewController().frontViewController.view.isUserInteractionEnabled = true

希望这能解决您的问题。干杯。

在您的前视图控制器中 class。在 viewdidload() 方法上编写此代码。

override func viewDidLoad() {
        super.viewDidLoad()

        menuBtn.addTarget(self.revealViewController(), action: #selector(SWRevealViewController.revealToggle(_:)), for: .touchUpInside)

        revealViewController().delegate = self

        // Once time - See documented SWRevealViewController.h
        revealViewController().tapGestureRecognizer()
        revealViewController().panGestureRecognizer()
}

然后在前视图控制器中使用来自 SWRevealviewcontroller 的委托

func revealController(_ revealController: SWRevealViewController!, willMoveTo position: FrontViewPosition) {
        if position == FrontViewPosition.right {
            revealController.frontViewController.view.isUserInteractionEnabled = false
        }
        else {
            revealController.frontViewController.view.isUserInteractionEnabled = true
        }
    }

这将达到您的期望....