Hotspot/Call 使用自定义转换时,UINavigationBar 低于 StatusBar

UINavigationBar below StatusBar after Hotspot/Call when using custom transition

Statusbar 后面的 NavigationBar 有一个奇怪的问题。

仅当默认状态栏更改为 "active" 状态栏时才会发生,例如在通话中或 wifi 热点期间出现的状态栏。

在 "active" 状态栏出现之前,它看起来像这样(完全没问题):

当我启用 wifi 热点时它仍然很好:

但是当我禁用 wifi 热点或结束通话时,状态栏大小会缩小到之前的大小,但 ViewController(在本例中为 UITableViewController)不会再次向上移动。看起来它有状态栏大小的上边距。此外,状态栏是透明的,我可以在 下方 实际 table 视图控制器下看到视图控制器的背景。

关于这个问题有什么想法吗?

更新: 我发现这是因为我实现了自定义模式转换。

应该是溶解动画。 那是代码:

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
}

}

我发现是因为我的自定义模式转换呈现了这个视图。

iOS 中有一个奇怪的错误,即在更改 statusBar 后屏幕内的视图不会调整大小。这也出现在很多知名App中。

我通过在状态栏大小更改时调整视图大小来修复它。 在您的 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
                })
            }
        }
    }
}