【问题标题】:Swift 2 - SWRevealViewController: Remove interaction on frontview when menu is openSwift 2 - SWRevealViewController:菜单打开时删除前视图上的交互
【发布时间】:2016-06-02 09:23:46
【问题描述】:

我已经为我的 Swift 应用程序中的滑出式菜单实现了 SWRevealViewController。这个框架的一个问题是,当菜单(后视图)展开时,用户仍然可以与前视图交互。由于我的 frontView 是全出血地图,因此很难通过点击 frontView 来关闭菜单,因为它不会将其识别为平移/点击来关闭它,而是会四处移动地图。

Objective-C here 也有同样的问题。来自@hardluckbaby 的top answer 似乎是最好的解决方案,但它在Objective-C 中。我已经在 Swift 中得到了答案的第一部分,我需要第二部分的帮助。

如果在我的后视图控制器中添加这两个功能,当后视图(菜单)打开时成功禁用前视图上的交互:

override func viewWillAppear(animated: Bool) {
  self.revealViewController().frontViewController.view.userInteractionEnabled = false  
}

override func viewWillDisappear(animated: Bool) {
  self.revealViewController().frontViewController.view.userInteractionEnabled = true
}

这最后一部分我需要帮助转换为 Swift。假设为我的 frontView 重新启用平移/点击手势。在我的 frontView 中,我想将以下内容放在我的 ViewDidLoad 函数中:

SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];

最后一部分如何用 Swift 编写?

我尝试将它添加到此功能,但它无法识别我的水龙头。我需要从这个 IF 语句中删除它吗?

override func viewDidLoad() {
   super.viewDidLoad()

   if self.revealViewController() != nil {
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
     self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
   }
}

【问题讨论】:

    标签: ios swift swrevealviewcontroller


    【解决方案1】:

    找到了一个不同的解决方案,仍然可以达到相同的结果(当后视图/菜单打开时禁用与 frontView 的交互)。它还有一个额外的好处,那就是“调暗”frontView,让用户将注意力集中在菜单上。

    menuController 中不需要代码,我删除了我在问题中引用的 viewWillAppearviewWillDisappear 中的代码。

    以下是我添加到我的 frontView 控制器的内容。一个缺点是此代码需要包含在您想要在菜单打开时禁用交互的所有控制器中。

    确保将SWRevealViewControllerDelegate 添加到您声明类的位置。

    完整的frontViewController代码:

    // make sure to add SWRevealViewControllerDelegate to the class declaration
    class LocationConfirmViewController: UIViewController, SWRevealViewControllerDelegate {    
    
      @IBOutlet weak var menuBtn: UIBarButtonItem!
    
      override func viewDidLoad() {
          super.viewDidLoad()
    
          //menu button control
          if self.revealViewController() != nil {
            menuBtn.target = self.revealViewController()
            menuBtn.action = "revealToggle:"
    
            //new line to declare delegate
            self.revealViewController().delegate = self
            self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
          }
      }
    
    
      // MARK: - Navigation
    
      //controls the frontView when the menu is opened.
      //creates a mask that dims the view and blocks any interaction except for tap or pan to close the menu.
      func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition){
          let tagId = 4207868622
    
          if revealController.frontViewPosition == FrontViewPosition.Right {
              let lock = self.view.viewWithTag(tagId)
              UIView.animateWithDuration(0.25, animations: {
                  lock?.alpha = 0
                  }, completion: {(finished: Bool) in
                      lock?.removeFromSuperview()
                  }
              )
              lock?.removeFromSuperview()
          } else if revealController.frontViewPosition == FrontViewPosition.Left {
              let lock = UIView(frame: self.view.bounds)
              lock.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
              lock.tag = tagId
              lock.alpha = 0
              lock.backgroundColor = UIColor.blackColor()
              lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: "revealToggle:"))
              self.view.addSubview(lock)
              UIView.animateWithDuration(0.5, animations: {
                  lock.alpha = 0.333
                  }
              )
          }
      }
    }
    

    感谢@mixth 和他的answer here 对一个类似的问题。我做了一些更改,并添加了更多关于如何准确实现的描述。由于我是 Swift 的新手,我很难理解他的回答。希望这对其他人有所帮助。

    【讨论】:

    • 你写了lock?.removeFromSuperview(),前面的位置是对的,为什么不把左视图完成后去掉呢?
    • @tylerSF 这个方法不需要我 funcrevealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) in swift 3
    • @UmaMadhavi 您是否将 SWRevealViewControllerDelegate 添加到类声明中?
    【解决方案2】:

    您需要将该代码移动到viewDidAppear,因为viewDidLoad 只会在第一次被调用,而另一个函数将在每次视图重新显示在屏幕上时被调用。

    【讨论】:

    • 将第二部分移动到viewDidAppear 并没有改变任何东西。 frontView 仍然不可点击。我的 If 语句是 Obj-C 代码的正确翻译吗?
    • 是的,没错。也许尝试将revealViewController的委托设置为self
    • 嗯。那仍然没有用。但我终于做了另一种方法来使视图正确变暗。将在下面发布完整答案。
    • @pbush25 。我的委托方法没有调用我不明白它为什么会发生
    猜你喜欢
    • 2014-05-01
    • 2017-08-22
    • 2017-05-17
    • 1970-01-01
    • 2017-01-19
    • 2016-10-03
    • 2017-01-22
    • 2016-06-20
    • 2020-12-05
    相关资源
    最近更新 更多