5

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

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

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

根VC

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

第二个VC

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

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

4

1 回答 1

9

我收到了来自 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-10-04T08:11:12.237 回答