Вид наложения показывается, но не удаляется - PullRequest
0 голосов
/ 30 октября 2018

У меня есть BaseViewController и SideMenu , который использует мой MenuViewController. Есть много возможных «домашних» экранов, которые все наследуются от этого же BaseViewController. MenuViewController также наследуется от BaseViewController.

Я бы хотел, чтобы наложение отображалось на главном экране, а затем исчезало, когда меню больше не в фокусе. Пока что я могу только показать оверлей, но не исчезнуть.

Наложение исчезает, если я касаюсь одного из пунктов меню, который выполняет переход к соответствующему подклассу BaseViewController (например, домашнему экрану или экрану настроек). Это эффективно обновляет экран, и я думаю, что могу сохранить ссылку на вызывающего абонента и перейти к ней, если не смогу найти лучшего решения.

Вещи, которые я пробовал:

  • overlay.removeFromSuperview()
  • view.sendSubview(toBack: overlay)
  • overlay.isHidden = true
  • overlay.alpha = 0.0
  • Перемещение hideOverlay() в MenuViewController.
  • Использование super.overlay в MenuViewController вместо простого overlay или self.overlay.

Я могу подтвердить, что все строки кода имеют точки останова, но наложение не исчезает. ViewWillAppear () BaseViewController не вызывается, когда я нажимаю, чтобы заставить меню исчезнуть, потому что его подкласс уже виден (просто немного сдвинут в сторону).

Вот минимальный воспроизводимый пример:

КОНТРОЛЛЕР ОСНОВНОГО ВИДА

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 голосов
/ 31 октября 2018

В viewWillDisappear, когда вы звоните self.hideOverlay, вы звоните на свой MenuViewController.

Когда вызывается showMenu(), вы представляете MenuViewController, а затем устанавливаете цвет фона наложения на , представляющем контроллер представления.

Я полагаю, что вы хотите сделать здесь в завершении MenuViewController, метод dismiss do:

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

Надеюсь, это имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...