【问题标题】:Navigating to a view controller with a transparent navigation bar from a non-transparent navigation bar on iOS 15从 iOS 15 上的非透明导航栏导航到具有透明导航栏的视图控制器
【发布时间】:2021-11-21 11:28:00
【问题描述】:

在 iOS 15 上,当导航到具有透明导航栏的视图控制器时,透明栏的动画无法按预期工作。

但是,如果您使用透明导航栏导航回视图控制器,动画将按预期工作。

这就是我设置视图控制器的方式:

rootVC

let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = UIColor.red

self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance

第一VC

let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()

self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance

secondVC

let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = UIColor.yellow

self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance

请注意,在以下示例中,从 secondVC -> firstVC 而不是从 rootVC -> firstVC:

示例项目:https://github.com/karlingen/NavigationTest

任何想法为什么它会这样?

【问题讨论】:

  • 在导航过程中更改导航栏透明度是不是有点不支持?它应该一直坐在那里。
  • 这也可能与stackoverflow.com/questions/41842359/…有关吗?
  • @matt 为什么不支持它?除非我错过了什么,否则文档没有说什么?此外,这适用于 iOS
  • 这就是为什么我说“有点”:)
  • 透明和不透明导航栏之间的转换在 iOS 上一直很不稳定。我建议为此使用第三方库。我对这个有很好的经验:github.com/MoZhouqi/KMNavigationBarTransition

标签: ios uinavigationcontroller uinavigationbar ios15 uinavigationbarappearance


【解决方案1】:

我收到了 Apple 的以下回复:

您应该使用每个项目的自定义来获得更好的行为,即在其视图控制器的 UINavigationItem 上而不是在 UINavigationBar 本身上设置这些属性。这也将您从 viewWillAppear: 工作方法所需的严格时间中解放出来——只要在视图控制器被推送之前应用您的自定义,您就应该获得良好的过渡。在使用逐项自定义支持时,viewDidLoad 通常是进行这些自定义的好地方。

所以我们应该改用UINavigationItem。 使用以下代码为我修复了它:

# firstVC.swift    
override func viewDidLoad() {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithTransparentBackground()
    
    self.navigationItem.standardAppearance = appearance
    self.navigationItem.scrollEdgeAppearance = appearance
}

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2021-12-24
    • 2014-11-08
    • 2020-09-19
    • 2018-03-05
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多