0

У меня странная проблема с NavigationBar за Statusbar.UINavigationBar ниже StatusBar после Hotspot/Call при использовании пользовательского перехода

Это происходит только тогда, когда строка состояния по умолчанию изменяется на «активную» панель состояния, такую ​​как та, которая появляется во время активного вызова или горячей точки Wi-Fi.

До появления "активный" статусной, это выглядит следующим образом (что вполне нормально):

enter image description here

Когда я включаю WiFi точки доступа, это еще хорошо:

enter image description here

Но когда я отключу точку доступа Wi-Fi или завершаю вызов, размер статусной панели сокращается до прежнего размера, но ViewController (в данном случае UITableViewController) не перемещает u p снова. Похоже, что он имеет верхний край размера статусных баров. Кроме того, панель состояния прозрачна, и я вижу фон контроллера вида ниже фактического контроллера табличного представления.

enter image description here

Любые идеи по этому вопросу?

Обновление: Я понял, что это из-за специального модального перехода, который я реализовал.

Это должно быть растворить анимация. Вот код:

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

ли это происходит только на этом конкретном контроллере? Выполняете ли вы какой-либо специальный код, связанный со строкой состояния контроллера, например 'prefersStatusBarHidden',' preferredStatusBarStyle' или 'preferredStatusBarAnimation'? У вас есть код состояния в делегате приложения? Любые строки состояния, связанные с информацией в info.plist? – Kumuluzz

+0

@ Kumuluzz Nope, ничего. Нет настройки statusBar 'внешний вид', нет' preferredStatusBarStyle', ничего ... Единственное, что приходит мне на ум - это особый переход на модальный вид, который представляет этот диспетчер представлений. Но это также встречается во всех других viewcontroller _after_ this. Может быть, это был переход? – Chris

ответ

0

я узнал, что это из-за мой пользовательские модальный переход, представившего эту точку зрения.

В iOS есть некоторая ошибка, которая не изменяется при просмотре statusBar. Это также появляется во многих известных приложениях.

Я исправил его, изменив размеры просмотров при изменении размера строки состояния. Используйте следующий код в 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

Проблема с этим методом заключается в том, что у вас есть ошибка, когда вы повторно активируете точку доступа на одном и том же представлении, что означает, что ваш вид не будет повторен, как предполагается –

Смежные вопросы