【发布时间】: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
}
}
【问题讨论】:
-
它只发生在那个特定的控制器上吗?您是否在控制器中实现了任何与状态栏相关的特殊代码,例如
prefersStatusBarHidden、preferredStatusBarStyle或preferredStatusBarAnimation?您在应用程序委托中有任何状态条码吗? info.plist 中有任何与状态栏相关的内容吗? -
@Kumuluzz 不,没什么。没有状态栏
appearance自定义,没有preferredStatusBarStyle,什么都没有……我唯一想到的是一个自定义的模态视图转换,它呈现了这个视图控制器。但它也发生在所有其他视图控制器之后这个。会不会是自定义过渡?
标签: uitableview uinavigationcontroller uinavigationbar transition uistatusbar