0

J'ai un problème étrange avec le NavigationBar derrière le Statusbar.UINavigationBar ci-dessous StatusBar après Hotspot/Call lors de l'utilisation de la transition personnalisée

Cela ne se produit que lorsque la barre d'état par défaut est remplacée par une barre d'état "active" comme celle qui apparaît pendant un appel actif ou un hotspot wifi.

Avant la barre d'état "actif" apparaît, il ressemble à ceci (ce qui est parfaitement bien):

enter image description here

Lorsque j'activer le hotspot wifi, il est toujours très bien:

enter image description here

Mais quand je désactiver le hotspot wifi ou mettre fin à un appel, la taille de la barre d'état rétrécit à sa taille précédente, mais le ViewController (dans ce cas un UITableViewController) ne bouge pas p encore. On dirait qu'il a une marge supérieure de la taille des statusbars. En outre, la barre d'état est transparente et je peux voir l'arrière-plan du contrôleur de vue ci-dessous le contrôleur de vue de table réelle.

enter image description here

Toutes les idées sur cette question? Je me suis rendu compte que c'était à cause d'une transition modale personnalisée que j'avais implémentée.

Il doit s'agir d'une animation dissoudre. Ce est le code:

class DissolveTransition: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate { 
// vars 
private var duration: NSTimeInterval = 0.3 
private var presenting = true 


// MARK: - UIViewControllerAnimatedTransitioning 

func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { 
    return self.duration 
} 


func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
    let destination = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 

    if (destination?.isBeingPresented() == true) { 
     self.animatePresentation(transitionContext) 
    } 
    else { 
     self.animateDismissal(transitionContext) 
    } 
} 


private func animatePresentation(transitionContext: UIViewControllerContextTransitioning) { 
    self.animateDissolve(transitionContext) 
} 

private func animateDismissal(transitionContext: UIViewControllerContextTransitioning) { 
    self.presenting = false 
    self.animateDissolve(transitionContext) 
} 

private func animateDissolve(transitionContext: UIViewControllerContextTransitioning) { 
    let source = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! 
    let destination = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! 
    let container = transitionContext.containerView()! 

    destination.beginAppearanceTransition(true, animated: true) 

    let snapshotFromView = source.view.snapshotViewAfterScreenUpdates(true) 
    // 1. adding real view at the bottom of the view hierarchy 
    if (self.presenting) { 
     container.addSubview(destination.view) 
    } 

    // 2. adding snapshot of previous view to view hierarchy 
    container.addSubview(snapshotFromView) 

    // 3. removing (fade) prev snapshot view and show real VC 
    UIView.animateWithDuration(self.duration, animations: { 
     snapshotFromView.alpha = 0.0 
     }, completion: { (finished) in 
      if (finished) { 
       snapshotFromView.removeFromSuperview() 
       container.bringSubviewToFront(destination.view) 
      } 
      transitionContext.completeTransition(!transitionContext.transitionWasCancelled()) 
      destination.endAppearanceTransition() 
    }) 
} 


// MARK: - UIViewControllerTransitioningDelegate 

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return self 
} 

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return self 
} 

}

+0

est-il que sur ce contrôleur se produisant en particulier? Implémentez-vous un code spécial lié à la barre d'état du contrôleur, comme 'prefersStatusBarHidden',' preferredStatusBarStyle' ou 'preferredStatusBarAnimation'? Avez-vous un code à barres d'état dans le délégué de l'application? Tout ce qui se rapporte à la barre d'état dans info.plist? – Kumuluzz

+0

@Kumuluzz Non, rien. Aucune personnalisation de statusBar 'appearance', pas de' preferredStatusBarStyle', rien ... La seule chose qui me vient à l'esprit est une transition de vue modale personnalisée qui présente ce viewcontroller. Mais il se produit également dans tous les autres viewcontroller _after_ celui-ci. Pourrait-il être la transition personnalisée? – Chris

Répondre

0

j'ai découvert qu'il était à cause de ma transition modale personnalisée qui a présenté ce point de vue.

Il existe un bogue bizarre dans iOS: les vues à l'intérieur de l'écran ne sont pas redimensionnées après la modification du statusBar. Cela apparaît également dans de nombreuses applications bien connues.

Je l'ai corrigé en redimensionnant les vues lorsque la taille de la barre d'état change. Utilisez le code suivant dans votre AppDelegate:

func application(application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) { 

    if (newStatusBarFrame.size.height < 40) { 
     if let window = self.window, subviews = self.window?.subviews { 
      for view in subviews { 
       UIView.animateWithDuration(0.3, animations: { 
        view.frame = window.bounds 
       }) 
      } 
     } 
    } 
} 
+0

Le problème avec cette méthode est que vous avez un bug inverse lorsque vous réactivez le hotspot sur la même vue, ce qui signifie que votre vue ne sera pas poussée de nouveau comme elle est censée –