显示了叠加视图,但未删除

时间:2018-10-30 20:06:35

标签: ios swift residemenu

我有一个BaseViewController和一个使用我的MenuViewController的SideMenu。有许多可能的“主页”屏幕都从同一BaseViewController继承。 MenuViewController也继承自BaseViewController。

我希望在主屏幕上显示一个叠加层,然后在菜单不再清晰时消失。 到目前为止,我只能显示叠加层,而不能消失。

如果我点击菜单项之一,则叠加层消失,这将对BaseViewController的适当子类(例如,“主屏幕”或“设置”屏幕)进行选择。这样可以有效地刷新屏幕,并且我认为如果找不到更好的解决方案,我可以保留对调用方的引用并重新选择它。

我尝试过的事情:

  • overlay.removeFromSuperview()
  • view.sendSubview(toBack: overlay)
  • overlay.isHidden = true
  • overlay.alpha = 0.0
  • hideOverlay()移动到MenuViewController中。
  • 在MenuViewController中使用super.overlay,而不是简单地overlayself.overlay

我可以确认所有代码行都被断点击中,但是覆盖视图不会消失。当我点击以使菜单消失时,不会调用BaseViewController的viewWillAppear(),因为它的子类已经在视图中了(只是向侧面推了一点)。

这是一个最小的可重现示例:

基本视图控制器

import UIKit
import SideMenu

class BaseViewController: UIViewController {

    let overlay = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Setup
        overlay.frame = self.view.frame
        overlay.backgroundColor = UIColor.clear
        overlay.alpha = 0.5
        overlay.isUserInteractionEnabled = false
        overlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(overlay)
    }

    // WORKS
    func showMenu() {
        // menuLeftNavigationController is MenuViewController.
        self.present(SideMenuManager.menuLeftNavigationController!, animated: true) {
            UIView.animate(withDuration: 0.2) {
                self.overlay.backgroundColor = Constants.Colors.overlayColor // Already defined.
    }

   // PROBLEM IS HERE
   func hideOverlay() {
       UIView.animate(withDuration: 0.2) {
            self.overlay.backgroundColor = UIColor.clear
            self.overlay.setNeedsLayout()
            self.overlay.layoutIfNeeded()

            self.view.setNeedsLayout()
            self.view.layoutIfNeeded()
      }
   }

}

菜单视图控制器

import UIKit
import SideMenu

class MenuViewController: BaseViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Tableview boilerplate
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tableView.reloadData()
    }

    // BREAKPOINTS CONFIRM THIS CODE EXECUTES.
    override func viewWillDisappear(_ animated: Bool) {
        self.hideOverlay()
    }
}

1 个答案:

答案 0 :(得分:0)

viewWillDisappear中,当您致电self.hideOverlay时,就是在MenuViewController上致电。

调用showMenu()时,先显示MenuViewController,然后在 presenting 视图控制器上设置覆盖背景色。

我想,您想在这里完成MenuViewController,dismiss方法do:

if let presentingViewController = self.presentingViewController as? BaseViewController {
    presentingViewController.hideOverlay()
}

希望这有意义吗?