gpt4 book ai didi

ios - 显示覆盖 View ,但未删除

转载 作者:行者123 更新时间:2023-11-28 07:37:06 24 4
gpt4 key购买 nike

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

我希望在主屏幕上显示一个叠加层,然后在菜单不再处于焦点时消失。 到目前为止,我只能让叠加层显示,但不会消失。

如果我点击其中一个菜单项,叠加层就会消失,这会执行到 BaseViewController 的适当子类(例如,主屏幕或设置屏幕)的转换。这有效地刷新了屏幕,我认为如果我找不到更好的解决方案,我可以保留对调用者的引用并继续返回它。

我尝试过的事情:

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

我可以确认所有代码行都遇到了断点,但覆盖 View 并没有消失。当我点击使菜单消失时,BaseViewController 的 viewWillAppear() 没有被调用,因为它的子类已经在 View 中(只是被推到了一边)。

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

基础 View Controller

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

}

菜单 View Controller

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,然后在呈现 View Controller 上设置覆盖背景颜色。 p>

我猜,你想在这里做的是在 MenuViewController 完成时,dismiss 方法做:

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

希望这是有道理的?

关于ios - 显示覆盖 View ,但未删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53072133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com