Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用透明的导航栏和工具栏正确设置推送视图控制器的动画?_Ios_Swift_Uinavigationcontroller_Uikit_Uinavigationbar - Fatal编程技术网

Ios 如何使用透明的导航栏和工具栏正确设置推送视图控制器的动画?

Ios 如何使用透明的导航栏和工具栏正确设置推送视图控制器的动画?,ios,swift,uinavigationcontroller,uikit,uinavigationbar,Ios,Swift,Uinavigationcontroller,Uikit,Uinavigationbar,在我的应用程序的导航控制器中,我想推一个带有清晰导航栏和工具栏的视图控制器。当第一个视图控制器再次出现时,我希望导航栏和工具栏再次具有其默认外观 我在模拟器设置中打开了慢速动画,以便您可以看到它的外观: 在过渡期间,导航栏上方和主指示器下方的区域看起来不太正确,因为那里什么都没有,而实际的导航栏和工具栏会淡出 此外,当弹出控制器时,工具栏会立即出现。当使用“刷回”手势以交互方式取消它时,这看起来尤其糟糕 使用iOS 13中新的UIBarAppearance类,我可能会让它看起来不错,但我想继续

在我的应用程序的导航控制器中,我想推一个带有清晰导航栏和工具栏的视图控制器。当第一个视图控制器再次出现时,我希望导航栏和工具栏再次具有其默认外观

我在模拟器设置中打开了慢速动画,以便您可以看到它的外观:

在过渡期间,导航栏上方和主指示器下方的区域看起来不太正确,因为那里什么都没有,而实际的导航栏和工具栏会淡出

此外,当弹出控制器时,工具栏会立即出现。当使用“刷回”手势以交互方式取消它时,这看起来尤其糟糕

使用iOS 13中新的
UIBarAppearance
类,我可能会让它看起来不错,但我想继续支持iOS的旧版本

这是我目前掌握的代码。这些方法位于局部视图控制器内。此外,我不想真的将背景色设置为白色,但会获得默认的模糊外观,即使在黑暗模式下,但不确定要将其设置回什么

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    func doThings() {
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.backgroundColor = .clear
        navigationController?.navigationBar.barTintColor = .clear

        navigationController?.toolbar.setBackgroundImage(UIImage(), forToolbarPosition: .bottom, barMetrics: .default)
        navigationController?.toolbar.setShadowImage(UIImage(), forToolbarPosition: .bottom)
        navigationController?.toolbar.backgroundColor = .clear
        navigationController?.toolbar.barTintColor = .clear
    }

    guard self.navigationController?.topViewController === self else { return }
    let animationsWereQueuedSuccessfully = self.transitionCoordinator?.animate(alongsideTransition: { [weak self] context in
        guard self != nil else { return }
        doThings()
    }, completion: nil)

    if animationsWereQueuedSuccessfully != true {
        doThings()
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    func doThings() {
        navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
        navigationController?.navigationBar.shadowImage = nil
        navigationController?.navigationBar.backgroundColor = .white
        navigationController?.navigationBar.barTintColor = .white

        navigationController?.toolbar.setBackgroundImage(nil, forToolbarPosition: .bottom, barMetrics: .default)
        navigationController?.toolbar.setShadowImage(nil, forToolbarPosition: .bottom)
        navigationController?.toolbar.backgroundColor = .white
        navigationController?.toolbar.barTintColor = .white
    }

    let animationsWereQueuedSuccessfully = self.transitionCoordinator?.animate(alongsideTransition: { [weak self] context in
        guard self != nil else { return }
            doThings()
    }, completion: nil)

    if animationsWereQueuedSuccessfully != true {
        doThings()
    }
}

我建议做一个自定义转换。听起来你需要比默认推送更大的功率。这是一篇中篇文章