如何使UIView始终显示在多个视图上

时间:2019-07-03 00:06:04

标签: ios swift xcode xib addsubview

我希望在我的应用程序中的每个视图控制器上创建并显示一个视图,以允许用户与其交互或在其下方的视图控制器进行交互。我希望该视图始终显示在我可以显示或选择的任何视图之上。

我有一个自定义UIView,当用户点击表格视图单元格时会出现。在didSelectRowAt tableView函数中,我尝试过:

(UIApplication.shared.delegate as! AppDelegate).window?.addSubview(self.subView!)

self.view.addSubview(self.subView!)

这两个功能都与显示在当前View控制器上的视图类似,并且允许用户与表格保持交互。但是,当我显示一个新的ViewController时,该子视图会消失,因为尚未将其添加到新的视图中。

1 个答案:

答案 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
    }

注意:我尚未测试此代码。让我在评论中告知您是否有问题。