【问题标题】:How to keep a UIView always showing over multiple views如何保持 UIView 始终显示在多个视图上
【发布时间】:2019-11-13 15:03:45
【问题描述】:

我希望在我的应用程序中的每个视图控制器上创建并呈现一个视图,允许用户与它或它下面的视图控制器进行交互。我希望视图始终出现在我可能呈现或继续的任何视图之上。

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

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

self.view.addSubview(self.subView!)

两者的功能相似,视图出现在当前视图控制器上并允许用户仍然与表格交互。但是当我展示一个新的 ViewController 时,subView 会消失,因为它还没有被添加到新的 View 中。

【问题讨论】:

    标签: ios swift xcode xib addsubview


    【解决方案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
        }
    

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

    【讨论】:

    • 我不得不将 addSubview 覆盖的 else 部分设为 super.addSubview(view),但它的作用就像一个魅力。非常感谢!
    猜你喜欢
    • 2011-04-11
    • 2011-07-14
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2019-08-16
    • 2018-08-18
    相关资源
    最近更新 更多