【问题标题】:UINavigationBar below StatusBar after Hotspot/Call when using custom transition使用自定义转换时热点/呼叫后状态栏下方的 UINavigationBar
【发布时间】:2016-02-01 16:29:35
【问题描述】:

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

只有在默认状态栏变为“活动”状态栏时才会出现这种情况,例如在通话或 wifi 热点期间出现的状态栏。

在“活动”状态栏出现之前,它看起来像这样(非常好):

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

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

对这个问题有什么想法吗?

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

它应该是一个溶解动画。 代码如下:

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
}

}

【问题讨论】:

  • 它只发生在那个特定的控制器上吗?您是否在控制器中实现了任何与状态栏相关的特殊代码,例如prefersStatusBarHiddenpreferredStatusBarStylepreferredStatusBarAnimation?您在应用程序委托中有任何状态条码吗? info.plist 中有任何与状态栏相关的内容吗?
  • @Kumuluzz 不,没什么。没有状态栏appearance 自定义,没有preferredStatusBarStyle,什么都没有……我唯一想到的是一个自定义的模态视图转换,它呈现了这个视图控制器。但它也发生在所有其他视图控制器之后这个。会不会是自定义过渡?

标签: uitableview uinavigationcontroller uinavigationbar transition uistatusbar


【解决方案1】:

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

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
                })
            }
        }
    }
}

【讨论】:

  • 这个方法的问题是当你在同一个视图上重新激活热点时你有一个错误,这意味着你的视图不会像它应该的那样被再次推送
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多