如何保持 UIView 始终显示在多个视图上
How to keep a UIView always showing over multiple views
我希望在我的应用程序中的每个视图控制器上创建并呈现一个视图,允许用户与它或它下面的视图控制器进行交互。我希望该视图始终显示在我可能呈现或转到的任何视图之上。
我有一个自定义 UIView,它会在用户点击 table 视图单元格时出现。在我尝试过的 didSelectRowAt tableView 函数中:
(UIApplication.shared.delegate as! AppDelegate).window?.addSubview(self.subView!)
和
self.view.addSubview(self.subView!)
两者的功能与显示在当前视图控制器上的视图类似,并允许用户与 table 静止交互。但是当我呈现一个新的 ViewController 时,子视图消失了,因为它还没有被添加到新视图中。
Subclass 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)
}
}
您必须确保应用委托使用您的自定义 class 作为应用的主要 window,而不是超级 class UIWindow
。为此,从您的 Info.plist 中删除 "Main storyboard file base name" 条目,而是在您的 AppDelegate 中手动实例化主 window:
@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
}
注意:我还没有测试过这段代码。如果有问题请在评论中告诉我。
我希望在我的应用程序中的每个视图控制器上创建并呈现一个视图,允许用户与它或它下面的视图控制器进行交互。我希望该视图始终显示在我可能呈现或转到的任何视图之上。
我有一个自定义 UIView,它会在用户点击 table 视图单元格时出现。在我尝试过的 didSelectRowAt tableView 函数中:
(UIApplication.shared.delegate as! AppDelegate).window?.addSubview(self.subView!)
和
self.view.addSubview(self.subView!)
两者的功能与显示在当前视图控制器上的视图类似,并允许用户与 table 静止交互。但是当我呈现一个新的 ViewController 时,子视图消失了,因为它还没有被添加到新视图中。
Subclass 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)
}
}
您必须确保应用委托使用您的自定义 class 作为应用的主要 window,而不是超级 class UIWindow
。为此,从您的 Info.plist 中删除 "Main storyboard file base name" 条目,而是在您的 AppDelegate 中手动实例化主 window:
@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
}
注意:我还没有测试过这段代码。如果有问题请在评论中告诉我。