如何保持 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
    }

注意:我还没有测试过这段代码。如果有问题请在评论中告诉我。