滑动回根视图控制器时,大型导航栏背景颜色变得清晰

Posted

技术标签:

【中文标题】滑动回根视图控制器时,大型导航栏背景颜色变得清晰【英文标题】:large Navigation Bar backGround gets clear color when swiping back to root viewController 【发布时间】:2018-05-22 07:56:01 【问题描述】:

我使用了largeNavigationBar,在我滑回根视图控制器并且大导航以令人讨厌的方式获得清晰的颜色之前,一切正常。代码如下:

func largeNavigationTitle() 
   
    self.navigationController?.view.backgroundColor = VVUtility.navigationBarColor()
    let productTitle = request?.product?.name
    self.navigationItem.title = "\(productTitle ?? " ")".localized()
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white, NSAttributedStringKey.font : VVUtility.normalFontWithPlusSize(increaseSize: -2.0)]
    
    if #available(ios 11.0, *) 
        self.navigationController?.navigationBar.prefersLargeTitles = true
        self.navigationController?.navigationBar.backgroundColor = VVUtility.splashBackGroundColor()
        self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white, NSAttributedStringKey.font : VVUtility.normalFontWithPlusSize(increaseSize: 0.0)]
     else 
        // Fallback on earlier versions
    
    

我在viewWillAppearviewDidLoad 都记得largeNavigationTitle()

更新

这是两种状态的截图:

刷卡前:imgur.com/a/ZcSOrov

刷卡时:imgur.com/a/DYeeot8

【问题讨论】:

你在用ib吗?在这种情况下,请检查故事板中的颜色是否正确。 @andromedainiative 我已经以编程方式实现了 navigationController,而不是在故事板中 @OmidKia 添加导航栏截图 @a.masri 在向后滑动之前:imgur.com/a/ZcSOrov 在向后滑动时:imgur.com/a/DYeeot8 @OmidKia 尝试设置条形色调self.navigationController?.navigationBar.barTintColor = UIColor.red 并设置isTranslucent false 【参考方案1】:

试试这个。它应该将根视图控制器的导航栏颜色设置为您想要的颜色:

func largeNavigationTitle() 

    self.navigationController?.view.backgroundColor = VVUtility.navigationBarColor()
   //add the two lines below
    self.navigationController?.navigationBar.barTintColor = VVUtility.navigationBarColor()
    self.navigationController?.navigationBar.isTranslucent = false

    let productTitle = request?.product?.name
    self.navigationItem.title = "\(productTitle ?? " ")".localized()
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white, NSAttributedStringKey.font : VVUtility.normalFontWithPlusSize(increaseSize: -2.0)]

    if #available(iOS 11.0, *) 
        self.navigationController?.navigationBar.prefersLargeTitles = true
        self.navigationController?.navigationBar.backgroundColor = VVUtility.splashBackGroundColor()
        self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white, NSAttributedStringKey.font : VVUtility.normalFontWithPlusSize(increaseSize: 0.0)]
     else 
        // Fallback on earlier versions
    


【讨论】:

【参考方案2】:

您是否在代码中尝试过这个?

self.navigationController.navigationBar.translucent = NO;

【讨论】:

你的方法 largeNavigationTitle() 是在 rootViewController 中实现的吗? 它不应该被实施。我只需要子视图控制器中的大型导航控制器 是的,但是如果你滑回你的 rootViewController,方法就不再被调用了?【参考方案3】:

这实际上是您的导航栏在底部控制器上变回小栏模式。

这是因为您的导航栏不是半透明的。这会导致(默认情况下)内容控制器停止在导航栏的底部。因此,当导航栏再次变小时,它的新的、较短的底部和视图控制器的顶部之间没有任何内容。

您的层次结构将如下所示:

现在UIViewController 上有一个默认为 false 的属性。您可以使用它来指定您希望控制器的视图在非半透明栏下扩展:

extendedLayoutIncludesOpaqueBars = true

这立即使层次结构现在显示为:

现在您应该不再有差距 - 但您可能会遇到 UI 元素在栏下方的问题。您可以通过使用安全区域插图并根据需要调整布局来处理这个问题,使用 edgesForExtendedLayout 也可能会有所帮助,具体取决于您的布局。

TL;DR 使用extendedLayoutIncludesOpaqueBars = true

【讨论】:

以上是关于滑动回根视图控制器时,大型导航栏背景颜色变得清晰的主要内容,如果未能解决你的问题,请参考以下文章

模态segue推动顶部的附加导航栏滑动

在将导航控制器弹出回根视图的选项卡栏上检测到双击

如果同时触发滑动手势和后退按钮,导航栏会变得很时髦

向后滑动失败时,SwiftUI 导航栏项目变得混乱

iOS hidesBarsOnSwipe 状态栏背景颜色

使用 Swift 3 的导航栏背景颜色灯