gpt4 book ai didi

ios - 如何使用透明导航栏和工具栏正确地动画推送 View Controller ?

转载 作者:行者123 更新时间:2023-11-28 05:38:12 25 4
gpt4 key购买 nike

在我的应用程序的导航 Controller 中,我想推送一个带有清晰导航栏和工具栏的 View Controller 。当第一个 View Controller 再次出现时,我希望导航栏和工具栏再次具有它们的默认外观。

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

Demo video

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

此外,弹出 Controller 时,工具栏会立即出现。当使用向后滑动手势以交互方式关闭它时,这看起来尤其糟糕。

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

这是我目前的代码。这些方法在细节 View Controller 中。此外,我不想真正将背景颜色设置为白色,而是获得默认的模糊外观,即使在黑暗模式下也是如此,但我不确定将其设置回什么。

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

最佳答案

我建议进行自定义转换。听起来您需要比默认推送更多的功能。这是一篇中篇文章。

https://medium.com/chili-labs/custom-navigation-transitions-f791ff0a46aa

关于ios - 如何使用透明导航栏和工具栏正确地动画推送 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57895881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com