我希望在我的应用程序中的每个视图控制器上创建并显示一个视图,以允许用户与其交互或在其下方的视图控制器进行交互。我希望该视图始终显示在我可以显示或选择的任何视图之上。
我有一个自定义UIView,当用户点击表格视图单元格时会出现。在didSelectRowAt tableView函数中,我尝试过:
(UIApplication.shared.delegate as! AppDelegate).window?.addSubview(self.subView!)
和
self.view.addSubview(self.subView!)
这两个功能都与显示在当前View控制器上的视图类似,并且允许用户与表格保持交互。但是,当我显示一个新的ViewController时,该子视图会消失,因为尚未将其添加到新的视图中。
答案 0 :(得分:1)
子类UIWindow
,并重写addSubview()
以确保您的叠加层视图始终位于顶部:
weak var overlay: MyOverlayView!
override func addSubview(_ view: UIView) {
if let overlay = view as? MyOverlayView {
self.overlay = overlay
super.addSubview(overlay)
} else {
self.insertSubview(view, belowSubview: overlay)
}
}
您必须确保应用程序委托使用自定义类作为应用程序的主窗口,而不是超类UIWindow
。为此,请从Info.plist中删除“主故事板文件库名称”条目,然后在AppDelegate中手动实例化主窗口:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: MyCustomWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
self.window = MyCustomWindow(frame: UIScreen.main.bounds)
// 1. Add your overlay view to the window
// (...)
// 2. Load your initial view controller from storyboard, or
// instantiate it programmatically
// (...)
window?.makeKeyAndVisible()
return true
}
注意:我尚未测试此代码。让我在评论中告知您是否有问题。