大标题到常规标题并返回

Posted

技术标签:

【中文标题】大标题到常规标题并返回【英文标题】:Large title to regular title and back 【发布时间】:2018-08-06 14:24:29 【问题描述】:

我想要一个带有大标题的视图,然后推送另一个带有常规标题的视图,然后返回到带有大标题的前一个视图。

我尝试在viewWillAppear 的第一个视图中设置prefersLargeTitles = true 并在viewWillAppear 的第二个视图中设置prefersLargeTitles = false。这可行,但标题没有像从第二个视图到第一个视图时那样的平滑过渡。

class FirstViewController: UIViewController 

  override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    navigationController?.navigationBar.prefersLargeTitles = true
  

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    if let secondViewController = secondViewController.storyboardInstance() 
      self.navigationController?.pushViewController(secondViewController, animated: true)
    
  


class SecondViewController: UIViewController 

  override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    navigationController?.navigationBar.prefersLargeTitles = false
  


【问题讨论】:

您介意展示您的代码吗? @regina_fallangi 已更新 搜索栏消失可能与您每次在viewWillAppear中设置搜索栏有关。将其设置为viewDidLoad 应该可以解决这部分问题 @regina_fallangi 我实际上刚刚意识到我不小心将搜索栏隐藏在其他地方并删除了修复该部分的内容。正如一个注释,我可以将它保存在 viewWillAppear 中,它工作正常。我将更新问题以仅关注标题问题 【参考方案1】:

因此,您依赖于 largeTitleDisplayMode 的默认值 .automatic,并且您使用 prefersLargeTitles 首先是 true,然后是 false。这并没有错,但我确实认为.automatic 有点令人困惑,因为它将采用任何先前的值,而不是仅在导航控制器的第一个视图控制器上设置。

如果可以的话,我会这样做:

FirstVClargetitleDisplayMode = .alwaysprefersLargeTitle = true SecondVClargeTitleDisplayMode = .neverprefersLargeTitle = true(是的.. 它必须是真的..)

SecondVC 必须使用prefersLargeTitle = true,因为从 Apple 文档中我们可以看到:

如果导航栏的prefersLargeTitles属性为false,则该属性无效,导航项的标题始终显示为小标题。

我写了一篇关于这个主题的文章,我还解释了如何修复.automatic https://www.morningswiftui.com/blog/fix-large-title-animation-on-ios13

【讨论】:

有点老了,不过还能用,应该选这个作为正确答案,谢谢Thomas!【参考方案2】:

您可以在FirstViewControllerviewWillDisappear 方法中将prefersLargeTitles 属性设置为false。像这样的东西应该可以工作:

class FirstViewController: UIViewController 

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        navigationController?.navigationBar.prefersLargeTitles = true
    

    override func viewWillDisappear(_ animated: Bool) 
        super.viewWillDisappear(animated)
        navigationController?.navigationBar.prefersLargeTitles = false
    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        if let secondViewController = secondViewController.storyboardInstance() 
            self.navigationController?.pushViewController(secondViewController, animated: true)
        
    

【讨论】:

这与我上面发布的代码相同。问题是返回第一个视图时,标题仍然没有平滑过渡。【参考方案3】:

您是否更改了第二个视图中后退按钮的字体?在我的案例中,这导致了标题的奇怪转变。我可以通过设置字体不仅为正常状态而且为突出显示状态来解决这个问题。

UIBarButtonItem.appearance().setTitleTextAttributes([kCTFontAttributeName as NSAttributedStringKey: UIFont(name: "Futura", size: 17)!], for: .normal)

UIBarButtonItem.appearance().setTitleTextAttributes([kCTFontAttributeName as NSAttributedStringKey: UIFont(name: "Futura", size: 17)!], for: .highlighted)

【讨论】:

以上是关于大标题到常规标题并返回的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 方向更改时导航栏不显示大标题

任何 util 类/方法来获取大字符串并返回 InputStream?

CUDA 结果使用非常大的数组返回垃圾,但不报告错误

Nginx+uWSGI+Django 在大请求正文和过期会话时返回 502

存储过程中的临时表返回的值与常规查询不同

NSFetchRequest 中函数计数的表达式返回比常规 fetch 少 1