【问题标题】:Navigation Bar Large Title - Animation Issue导航栏大标题 - 动画问题
【发布时间】:2020-03-31 16:33:18
【问题描述】:

我在导航栏上使用大标题,当我点击一个单元格以继续下一个控制器时,大标题有一个奇怪的动画(如下图所示)。它不会立即消失。

我尝试了以下解决方案,但没有成功 (https://www.morningswiftui.com/blog/fix-large-title-animation-on-ios13)

我的代码:

在第一个视图控制器上:

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

        navigationItem.title = "New Order"
        navigationController?.navigationBar.prefersLargeTitles = true
}

在第二个视图控制器上(带有大标题):

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

        navigationItem.title = "Menu"
        self.navigationController?.navigationBar.prefersLargeTitles = false
}

编辑:

法比奥的答案是解决方案,但现在我有另一个问题:

当我点击一个单元格时,导航栏的一部分是黑色的(如下所示)

【问题讨论】:

  • 你能给我看看代码吗?
  • 你试过添加viewWillDisappear函数并去掉导航标题吗?
  • 我添加我的代码!我尝试了 viewWillDisappear 函数,但没有结果。

标签: html ios swift xcode uinavigationbar


【解决方案1】:

尝试在第二视图控制器中使用viewDidLoad 而不是viewWillAppear

【讨论】:

  • 这正是我的实现的问题。
【解决方案2】:

将此扩展复制到设置导航栏:

extension UIViewController {
func configureNavigationBar(largeTitleColor: UIColor, backgoundColor: UIColor, tintColor: UIColor, title: String, preferredLargeTitle: Bool) {
if #available(iOS 13.0, *) {
    let navBarAppearance = UINavigationBarAppearance()
    navBarAppearance.configureWithOpaqueBackground()
    navBarAppearance.largeTitleTextAttributes = [.foregroundColor: largeTitleColor]
    navBarAppearance.titleTextAttributes = [.foregroundColor: largeTitleColor]
    navBarAppearance.backgroundColor = backgoundColor
    navigationController?.navigationBar.standardAppearance = navBarAppearance
    navigationController?.navigationBar.compactAppearance = navBarAppearance
    navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance

    navigationController?.navigationBar.prefersLargeTitles = preferredLargeTitle
    navigationController?.navigationBar.isTranslucent = false
    navigationController?.navigationBar.tintColor = tintColor
    navigationItem.title = title

} else {
    // Fallback on earlier versions
    navigationController?.navigationBar.barTintColor = backgoundColor
    navigationController?.navigationBar.tintColor = tintColor
    navigationController?.navigationBar.isTranslucent = false
    navigationItem.title = title
}}}

如何使用,调用viewWillAppear

configureNavigationBar(largeTitleColor: .yourColor, backgoundColor: .yourColor, tintColor: .yourColor, title: "YourTitle", preferredLargeTitle: true)

现在在 didSelectRow 中使用 pushVievController 调用第二个控制器,如下所示:

let controller = YourViewController()
    navigationController?.pushViewController(controller, animated: true)

在第二个控制器的 viewDidLoad 中将大标题设置为 false,如下所示:

navigationItem.largeTitleDisplayMode = .never

如果你想要轻量级的内容,在 info.plist 中将基于 ViewController 的状态栏设置为 NO。 如果您不希望 largeTitles 将其设置为 false 在 iOS 13 上测试,希望对您有所帮助 :) 现在你没事了:)

【讨论】:

  • 感谢您的回答。我尝试了你告诉我的一切,但问题仍然存在。
  • @AlexGiatrakis 摘要:复制第一个控制器中的扩展,在第一个控制器的 viewWillAppear 中配置导航栏:configureNavigationBar(largeTitleColor: .yourColor, backgoundColor: .yourColor, tintColor: .yourColor, title: "YourTitle", preferredLargeTitle: true),现在调用动作 pushViewController 来呈现第二个控制器,将这一行复制到第二个控制器的 viewDidLoad 中:navigationItem.largeTitleDisplayMode = .never 就完成了.... 测试
  • 感谢您的回答。但现在我有另一个问题。我已经编辑了我的帖子。
  • 在不使用 UINavigationBarAppearance 的情况下,当您使用大标题时,导航栏的背景会出现显示错误。谢谢@Fabio
  • @spnkr 很高兴有帮助:)
【解决方案3】:

第二期: 在 SceneDelegate 中:var window: UIWindow? 在功能场景中放这行:

window?.backgroundColor = .yourColor

像这样:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let _ = (scene as? UIWindowScene) else { return }
    window?.backgroundColor = .white
}

设置你想要的颜色,就是这样:)

【讨论】:

  • 谢谢!有用!你能向我解释一下这行代码是做什么的吗?
  • 简单的应用背景....你看到的黑条是应用的背景,它不是一个条:)
  • 或者设置extendedLayoutIncludesOpaqueBars为true,导致viewcontroller的frame不是全屏
【解决方案4】:

尝试在第一个 View Controller 上插入:

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

    navigationItem.title = "New Order"
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.largeTitleDisplayMode =  .always
 }

在第二个视图控制器上:

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

    navigationItem.title = "Menu"
    navigationItem.largeTitleDisplayMode = .never
}

【讨论】:

    【解决方案5】:

    所以你想要,你的第一个视图控制器有大标题,然后将以下代码添加到viewWillAppear(animated:)中的第一个视图控制器中

    self.navigationItem.largeTitleDisplayMode = .automatic
    self.navigationController?.navigationBar.prefersLargeTitles = true
    

    你想要,你的下一个视图控制器没有大标题,然后将以下代码添加到viewWillAppear(animated:)的下一个视图控制器中

    self.navigationItem.largeTitleDisplayMode = .never
    

    结论是你只需要设置self.navigationController?.navigationBar.prefersLargeTitlestrue 只是如果你希望你的视图控制器需要在出现视图的开头显示大标题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      相关资源
      最近更新 更多