Add a UIView above all, even the navigation bar

前端 未结 17 1634
悲&欢浪女
悲&欢浪女 2020-11-29 15:36

I want to display, above any other views, even the navigation bar, a kind of \"pop-up\" view that looks like this:

  • full screen black background with a 0.5 alph
相关标签:
17条回答
  • 2020-11-29 16:01

    Note if you want add view in Full screen then only use below code

    Add these extension of UIViewController

    public extension UIViewController {
       internal func makeViewAsFullScreen() {
          var viewFrame:CGRect = self.view.frame
          if viewFrame.origin.y > 0 || viewFrame.origin.x > 0 {
            self.view.frame = UIScreen.main.bounds
          }
       }
    }
    

    Continue as normal adding process of subview

    Now use in adding UIViewController's viewDidAppear

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
         self.makeViewAsFullScreen()
    }
    
    0 讨论(0)
  • 2020-11-29 16:02

    @Nam's answer works great if you just want to display your custom view but if your custom view needs user interaction you need to disable interaction for the navigationBar.

    self.navigationController.navigationBar.layer.zPosition = -1
    self.navigationController.navigationBar.isUserInteractionEnabled = false
    

    Like said in Nam's answer don't forget to reverse these changes:

    self.navigationController.navigationBar.layer.zPosition = 0
    self.navigationController.navigationBar.isUserInteractionEnabled = true
    


    You can do this in a better way with an extension:

    extension UINavigationBar {
        func toggle() {
            if self.layer.zPosition == -1 {
                self.layer.zPosition = 0
                self.isUserInteractionEnabled = true
            } else {
                self.layer.zPosition = -1
                self.isUserInteractionEnabled = false
            }
        }
    }
    

    And simply use it like this:

    self.navigationController.navigationBar.toggle()
    
    0 讨论(0)
  • 2020-11-29 16:05
    [self.navigationController.navigationBar.layer setZPosition:-0.1];
    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 20, 35, 35)];
    [view setBackgroundColor:[UIColor redColor]];
    [self.navigationController.view addSubview:view];
    [self.navigationController.view bringSubviewToFront:view];
    self.navigationController.view.clipsToBounds = NO;
    [self.navigationController.navigationBar.layer setZPosition:0.0];
    

    0 讨论(0)
  • 2020-11-29 16:06

    You can do that by adding your view directly to the keyWindow:

    UIView *myView = /* <- Your custom view */;
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
    [currentWindow addSubview:myView];
    

    UPDATE -- For Swift 4.1 and above

    let currentWindow: UIWindow? = UIApplication.shared.keyWindow
    currentWindow?.addSubview(myView)
    

    UPDATE for iOS13 and above

    keyWindow is deprecated. You should use the following:

    UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.addSubview(myView)
    
    0 讨论(0)
  • 2020-11-29 16:06

    In Swift 4.2 and Xcode 10

    var spinnerView: UIView? //This is your view
    
    spinnerView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
    //Based on your requirement change width and height like self.view.bounds.size.width
    spinnerView?.backgroundColor = UIColor.black.withAlphaComponent(0.6)
    //        self.view.addSubview(spinnerView)
    let currentWindow: UIWindow? = UIApplication.shared.keyWindow
    currentWindow?.addSubview(spinnerView!)
    

    In Objective C

    UIView *spinnerView;//This is your view

    self.spinnerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];  
    //Based on your requirement change width and height like self.view.bounds.size.width
    self.spinnerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    // [self.view addSubview:self.spinnerView];
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
    [currentWindow addSubview:self.spinnerView];
    

    This can work either Portrait OR Landscape mode only.

    One more simple code is:

    yourViewName.layer.zPosition = 1//Change you view name
    
    0 讨论(0)
  • 2020-11-29 16:07

    Dalef great solution in swift:

    self.navigationController?.view.addSubview(view)
    
    0 讨论(0)
提交回复
热议问题