在iOS 15上,从非透明导航栏导航至具有透明导航栏的视图控制器

6
在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

firstVC

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

请看下面的例子,注意从 secondVCfirstVC 的过渡是多么顺畅,但从 rootVCfirstVC 的过渡却不是这样。

video demonstration

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

有任何想法为什么它会表现得这样吗?


更改导航栏透明度作为导航的一部分,这不是有点不支持吗?它应该始终保持一致。 - matt
这是否与 https://stackoverflow.com/questions/41842359/black-smudge-under-navigation-controller-when-transitioning 有关? - matt
@matt 为什么会不支持呢?文档上没有提到,除非我漏看了什么? 此外,在 iOS < 15 上运行良好。 - karlingen
这就是为什么我说“有点儿”的原因 :) - matt
1
@matt 已修复!请参见下面的解决方案。 - karlingen
显示剩余2条评论
1个回答

16

我从苹果收到了以下回复:

您应该使用每个项目的自定义来获得更好的行为,即在其视图控制器的UINavigationItem上设置这些属性,而不是在UINavigationBar本身上设置。 这还使您摆脱了必须严格按照viewWillAppear:方法工作所需的时间限制 - 只要在推送视图控制器之前应用自定义,您就应该获得良好的转换效果。当使用每个项目的自定义支持时,viewDidLoad通常是执行这些自定义操作的好地方。

因此,我们应该使用 UINavigationItem。 对我有用的解决方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接