У меня есть 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()
}
}