ios - 显示叠加视图,但未删除
问题描述
我有一个 BaseViewController 和一个使用我的 MenuViewController的SideMenu 。有许多可能的“主页”屏幕都继承自同一个 BaseViewController。MenuViewController 也继承自 BaseViewController。
我希望在主屏幕上显示一个叠加层,然后在菜单不再聚焦时消失。到目前为止,我只能让覆盖显示,但不能消失。
如果我点击其中一个菜单项,则覆盖消失,该菜单项执行到 BaseViewController 的适当子类(例如,主屏幕或设置屏幕)。这有效地刷新了屏幕,我想如果我找不到更好的解决方案,我可以保留对调用者的引用并重新回到它。
我尝试过的事情:
overlay.removeFromSuperview()
view.sendSubview(toBack: overlay)
overlay.isHidden = true
overlay.alpha = 0.0
- 进入MenuViewController
hideOverlay()
。 super.overlay
在 MenuViewController 中使用而不是简单地使用overlay
orself.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()
}
}
解决方案
在viewWillDisappear
你打电话时self.hideOverlay
,你在你的MenuViewController
.
当showMenu()
被调用时,您呈现MenuViewController
然后在呈现视图控制器上设置覆盖背景颜色。
我想,您在这里要做的是在完成MenuViewController
, dismiss 方法时做:
if let presentingViewController = self.presentingViewController as? BaseViewController {
presentingViewController.hideOverlay()
}
希望这是有道理的?
推荐阅读
- scrapy - 通过 Selenium webdriver 在 javascript 驱动的页面导航上在 Scrapy 中进行分页
- flutter - 在 dart 中执行搜索操作时如何忽略类中的某些变量
- ios - Swift 中的泛型和 ViewModel
- c - POSIX 部分 write() 和信号中断
- visual-studio-2017 - MFC:Visual Studio 资源编辑器类向导在成员变量下没有所有控件 ID
- python - 罗马到整数 python
- python - 更新从函数获得的 pandas 数据帧值
- csv - 尝试在 Apache Spark 中将 Dataframe 写入 CSV 时出现不一致的行为
- tensorflow - 使用张量流的连续 STFT 变换增加了信号幅度
- javascript - 如何使用 Math.random() 在 JavaScript Tic Tac Toe 中的人类玩家和 AI 之间切换?