Добавьте UIView, прежде всего, даже панель навигации

Я хочу отображать над любыми другими видами даже панель навигации, своего рода всплывающее представление, которое выглядит так:

  • полноэкранный черный фон с 0,5 альфами, чтобы увидеть ниже UIViewController.
  • a UIView Окно посередине с некоторой информацией (календарь, если вы хотите все знать).

Чтобы сделать это, я создал UIViewController, который содержит два UIViews (фон и окно), и я пытаюсь его отобразить. Я пробовал простой [mySuperVC addSubview:myPopUpVC.view], но у меня все еще есть панель навигации выше.

Я попытался представить его как модальный, но внизу UIViewController исчезает, и я теряю эффект прозрачности.

Любая идея сделать это, я уверен, это довольно просто...

Спасибо!

Ответ 1

Вы можете сделать это, добавив свое представление непосредственно в keyWindow:

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

ОБНОВЛЕНИЕ - для Swift 4.1 и выше

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

Ответ 2

[self.navigationController.view addSubview:overlayView]; - это то, что вы действительно хотите

Ответ 3

Вот простое элегантное решение, которое работает для меня. Вы можете установить положение z на панели навигации ниже вида:

self.navigationController.navigationBar.layer.zPosition = -1;

Не забудьте вернуть его обратно в 0.

Ответ 4

Быстрые версии для проверенного ответа:

Swift 4:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)

Swift 3.1:

let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)

Ответ 5

Добавить представление в качестве подпункта NavigationController.

[self.navigationController.navigationBar addSubview: overlayView)]

Вы также можете добавить его в окно:

UIView *view = /* Your custom view */;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:view];

Надеюсь, это поможет..:)

Ответ 6

Большое решение Dalef в быстрой:

self.navigationController?.view.addSubview(view)

Ответ 7

Быстрая версия ответа @Nicolas Bonnet:

    var popupWindow: UIWindow?

func showViewController(controller: UIViewController) {
    self.popupWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
    controller.view.frame = self.popupWindow!.bounds
    self.popupWindow!.rootViewController = controller
    self.popupWindow!.makeKeyAndVisible()
}

func viewControllerDidRemove() {
    self.popupWindow?.removeFromSuperview()
    self.popupWindow = nil
}

Не забывайте, что окно должно быть сильным свойством, потому что исходный ответ приводит к немедленному освобождению окна

Ответ 8

Я рекомендую вам создать новый интерфейс UIWindow:

UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
window.rootViewController = viewController;
window.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
window.opaque = NO;
window.windowLevel = UIWindowLevelCFShareCircle;
window.backgroundColor = [UIColor clearColor];

[window makeKeyAndVisible];

Затем вы можете управлять своим видом в другом UIViewController. Чтобы удалить окна:

[window removeFromSuperview];
window = nil;

надеюсь, что это поможет!

Ответ 9

Существует несколько способов сделать это:

1- Добавьте UIView в UIWindow вместо добавления на UIViewController. Таким образом, он будет поверх всего.

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];

2- Используйте настраиваемый переход, который сохранит ваш UIViewController, отображающийся в задней части с 0,5 альфа

Для этого я рекомендую вам посмотреть: https://github.com/Citrrus/BlurryModalSegue

Ответ 10

Ответ @Nam отлично работает, если вы просто хотите отобразить свое собственное представление, но если ваше пользовательское представление требует взаимодействия с пользователем, вам необходимо отключить взаимодействие для navigationBar.

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

Как сказано в ответе Нам, не забудьте изменить эти изменения:

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


Вы можете сделать это лучше с расширением:
extension UINavigationBar {
    func toggle() {
        if self.layer.zPosition == -1 {
            self.layer.zPosition = 0
            self.isUserInteractionEnabled = true
        } else {
            self.layer.zPosition = -1
            self.isUserInteractionEnabled = false
        }
    }
}

И просто используйте его так:

self.navigationController.navigationBar.toggle()

Ответ 11

[[UIApplication sharedApplication].windows.lastObject addSubview:myView];

Ответ 12

Обратите внимание, что если вы хотите добавить просмотр в полноэкранном режиме, используйте только код

Добавьте эти расширения из 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
      }
   }
}

Продолжить как обычный процесс добавления subview

Теперь используйте при добавлении UIViewController viewDidAppear

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

     self.makeViewAsFullScreen()
}

Ответ 13

UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1)

Этот метод работает с xcode 9.4, iOS 11.4

Ответ 14

Я бы использовал подкласс UIViewController, содержащий "Container View", который встраивает ваши остальные контроллеры. После этого вы сможете добавить контроллер навигации в представление контейнера (например, с помощью встроенного отношения segue).

См. Внедрение контроллера просмотра контейнеров

Ответ 15

В Swift 4.2 и 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!)

В Задаче С

UIView * spinnerView;//Это ваш взгляд

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];

Это может работать как в портретном, так и в ландшафтном режиме.

Еще один простой код:

yourViewName.layer.zPosition = 1//Change you view name

Ответ 16

[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];

введите описание изображения здесь