自定义展开搜索期间导航栏为黑色

时间:2018-01-05 04:33:20

标签: uinavigationbar ios11 swift4 uistoryboardsegue xcode9

我制作了一个自定义UIStoryboardSegue,但当它展开时,它似乎会导致我的UINavigationBar变黑,然后回到它的正确颜色。请参阅下面的GIF。

enter image description here

我的自定义segue只是让新的ViewController从顶部下来,然后返回到顶部。

以下是UIStoryboardSegue代码:

import UIKit

class SlideDownSegue: UIStoryboardSegue {

var duration: Double = 0.5

override func perform() {

    let screenHeight = UIScreen.main.bounds.size.height
    let toVC = self.destination
    let fromVC = self.source

    toVC.view.transform = CGAffineTransform(translationX: 0, y: -screenHeight)
    UIApplication.shared.keyWindow?.insertSubview(toVC.view, aboveSubview: fromVC.view)

    UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        toVC.view.transform = CGAffineTransform.identity
    }, completion: {
        success in
        fromVC.present(toVC, animated: false, completion: nil)
    })
}
}

class UnwindSlideDownSegue: UIStoryboardSegue {

override func perform() {

    let screenHeight = UIScreen.main.bounds.size.height
    let toVC = self.destination
    let fromVC = self.source.parent!

    fromVC.view.superview?.insertSubview(toVC.view, at: 0)

    UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        fromVC.view.transform = CGAffineTransform(translationX: 0, y: -screenHeight - 100)
    }, completion: {
        success in
        fromVC.dismiss(animated: false, completion: nil)
    })
}
}

如果我通过转到屏幕底部然后保留我的自定义来显示新视图,那么让我们放开它的默认值,UINavigationBar保持它的正确颜色,它& #39;仅当我使用我提供的代码进行展开时,UINavigationBar在动画期间变为黑色。

任何提示都会非常感激。

--- 修改 ---

我玩了一点,如果我进入AppDelegate并将UINavigationBar.appearance().isTranslucent = false更改为true,我会得到一个白色背景,但只是看起来导航栏突然出现。我想知道是否由于某种原因被卸载,然后在View Controller激活后重新加载。

--- 编辑2 ---

我有点能用黑客修复它。在我AppDelegate func application(... didFinishLaunchingWithOptions ...)内添加了self.window?.backgroundColor = UIColor.{your color},但所有这一切都使得黑色部分现在显示为我的颜色,导航条在segue期间由于某种原因仍在消失。

2 个答案:

答案 0 :(得分:2)

这是使用snapshotView(afterScreenUpdates:)的绝佳机会。这就是UIKit执行许多库存转换的方式(即使在UINavigationController中),这是执行自定义转换的一种巨大方式,特别是如果您想要应用效果。拍摄目的地的快照(将有一个完整的导航栏),将其插入源的正下方,执行动画,关闭源以使目标准备就绪,最后删除您赢得的快照甚至请注意,因为它将完全镜像目的地。

答案 1 :(得分:1)

如果你想要一个简单的技巧,尝试将window的{​​{1}}中的AppDelegate背景颜色设置为导航栏的颜色,它适用于我:) 像这样 didFinishLaunchingWithOptions