簡體   English   中英

Swift 2-SWRevealViewController:菜單打開時刪除前視圖上的交互

[英]Swift 2 - SWRevealViewController: Remove interaction on frontview when menu is open

我已經在我的Swift應用程序中為滑出菜單實現了SWRevealViewController。 該框架的一個問題是,當菜單(rearView)展開時,用戶仍然可以與frontView進行交互。 由於我的frontView是一個完整的出血地圖,因此很難通過點擊frontView來關閉菜單,因為與其將其識別為平移/輕按來關閉它,還不如將地圖四處移動。

沒有為Objective-C的同樣的問題在這里 @hardluckbaby的最高答案似乎是最好的解決方案,但這是在Objective-C中。 我已經在Swift中獲得了答案的第一部分,第二部分需要幫助。

在我的RearView控制器中,如果添加了這兩個函數,則在打開RearView(菜單)時成功禁用frontView上的交互:

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())
   }
}

找到了一個仍然可以達到相同結果的解決方案(在打開RearView /菜單時禁用與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和他在這里對類似問題的回答。 我進行了一些更改,並添加了更多有關如何完全實現的描述。 由於我是Swift的新手,所以我很難理解他的答案。 希望這可以幫助其他人。

您需要將該代碼移到viewDidAppear因為viewDidLoad只會在第一次調用時調用,而其他功能將在每次視圖重新顯示在屏幕上時調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM