ios - Ajouter un UIView par-dessus tout, même la barre de navigation




uiviewcontroller uinavigationbar popupwindow (12)

Je veux afficher, au-dessus de toutes les autres vues, même la barre de navigation, une sorte de vue "pop-up" qui ressemble à ceci:

  • fond noir plein écran avec un alpha de 0,5 pour voir l'autre UIViewController dessous.
  • une fenêtre UIView au milieu avec quelques informations, (un calendrier si vous voulez tout savoir).

Pour ce faire, j'ai créé un UIViewController qui contient les deux UIViews (arrière-plan et fenêtre), et j'essaie de l'afficher. J'ai essayé un simple [mySuperVC addSubview:myPopUpVC.view] , mais j'ai toujours la barre de navigation ci-dessus.

J'ai essayé de le présenter comme un modal, mais le UIViewController disparaît et je perds mon effet de transparence.

Toute idée de le faire, je suis sûr que c'est assez simple ...

Merci!


Answers

Versions rapides pour la réponse vérifiée:

Swift 4:

let newView = UIView()
UIApplication.shared.keyWindow?.addSubview(newView)

Swift 3.1:

let newView = UIView()
UIApplication.sharedApplication().keyWindow?.addSubview(newView)

[self.navigationController.view addSubview:overlayView]; est ce que tu veux vraiment


Version rapide de la réponse de @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
}

Ne pas oublier que la fenêtre doit être une propriété forte, car la réponse originale conduit à une désallocation immédiate de la fenêtre


Ajoutez votre vue en tant que sous-vue de NavigationController.

[self.navigationController.navigationBar addSubview: overlayView)]

Vous pouvez également l'ajouter sur la fenêtre:

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

J'espère que cela t'aides.. :)


J'utiliserais une sous-classe UIViewController contenant une "Vue Conteneur" qui incorpore vos autres contrôleurs de vue. Vous serez alors en mesure d'ajouter le contrôleur de navigation à l'intérieur de la vue du conteneur (à l'aide de la section intégrée de la relation, par exemple).

Voir Implémentation d'un contrôleur de vue de conteneur


Voici une solution simple et élégante qui fonctionne pour moi. Vous pouvez définir la position z de la barre de navigation sous la vue:

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

N'oubliez pas de le remettre à 0 une fois terminé.


Je vous recommande de créer une nouvelle 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];

Ensuite, vous pouvez gérer votre vue dans un autre UIViewController. Pour enlever les fenêtres:

[window removeFromSuperview];
window = nil;

espère que cela aidera!


Notez que si vous voulez ajouter une vue en plein écran, utilisez uniquement le code ci-dessous

Ajoutez ces extensions de 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
      }
   }
}

Continuer comme processus d'ajout normal de sous-vue

Maintenant, utilisez en ajoutant viewDidAppear de UIViewController

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

     self.makeViewAsFullScreen()
}

Il y a plus d'une façon de le faire:

1- Ajoutez votre UIView sur UIWindow au lieu de l'ajouter sur UIViewController . De cette façon, il sera au-dessus de tout.

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

2- Utilisez la transition personnalisée qui gardera votre UIViewController montrant dans le dos avec un alpha de 0,5

Pour cela, je vous recommande de regarder ceci: https://github.com/Citrrus/BlurryModalSegue


Dalef excellente solution dans swift:

self.navigationController?.view.addSubview(view)

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


Il y a trois options principales.

  1. Déboguer en utilisant Safari. C'est bon pour déboguer une application hybride, mais ne peut pas vous dire la sortie liée aux plugins natifs. http://webdesign.tutsplus.com/articles/quick-tip-using-web-inspector-to-debug-mobile-safari--webdesign-8787
  2. Ouvrez le projet et créez le périphérique dans Xcode. Cela montre la sortie de l'ensemble du dispositif http://cordova.apache.org/docs/en/3.5.0/guide_platforms_ios_index.md.html#iOS%20Platform%20Guide
  3. Déboguer avec CLI ionique. En utilisant ionic run ios -l -c -s avec les drapeaux utilisera recharger en direct et imprimer les journaux à la console. http://ionicframework.com/blog/live-reload-all-things-ionic-cli/




ios uiviewcontroller uinavigationbar popupwindow