【问题标题】:How to keep navigation bar title large after pushing view controller from TableView从 TableView 推送视图控制器后如何保持导航栏标题较大
【发布时间】:2019-12-13 23:26:15
【问题描述】:

I have a tableview displaying on a main view controller, and when a row is selected a detail view controller is pushed.主视图控制器有一个大标题,细节视图控制器有一个小/常规标题。它们嵌入在导航控制器和标签栏控制器中。

Before selecting a row, the main view controller title is large, and when a row is selected the detail view controller title is regular as it should be.但是,当我从详细视图控制器(通过“返回”按钮)返回主视图控制器时,主视图控制器上的标题不再大。

我在主视图控制器上将“prefersLargeTitles”设置为 true,在细节视图控制器上将“largeTitleDisplayMode”设置为从不。

我尝试将“largeTitleDisplayMode”设置为始终在主视图控制器上无济于事。我还尝试在任一视图控制器上将其设置为自动,但似乎没有效果。

我也尝试过使用“viewWillAppear”和“viewWillDisappear”并在其中设置标题,虽然它确实将主视图控制器标题重置为大,但动画滞后并且不像通常那样流畅从小标题过渡到大标题时。

另外,我对编码还很陌生,这是我在不使用情节提要的情况下构建的第一个应用程序,因此代码可能一团糟。

主视图控制器代码:

class HomeViewController: UIViewController {

  let tableView = UITableView()

  override func loadView() {
      super.loadView()
      view.backgroundColor = .white
      self.title = "Home"

      // Set large title
      navigationController?.navigationBar.prefersLargeTitles = true


      // Make navigation bar transparent
      navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
      navigationController?.navigationBar.shadowImage = UIImage()
      navigationController?.navigationBar.isTranslucent = true


}


extension HomeViewController: UITableViewDelegate {

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

      let vc = DetailViewController() as DetailViewController

      if indexPath.section == 0 {
          vc.detailTitle = itemsTop[indexPath.row]
      } else if indexPath.section == 1 {
          vc.detailTitle = itemsBottom[indexPath.row]
      } else {
          print("Failed to load title")
      }


      navigationController?.pushViewController(vc, animated: true)

      tableView.deselectRow(at: indexPath, animated: true)
  }

}

DETAIL 视图控制器代码:

class DetailViewController: UIViewController {

  var detailTitle: String?

  override func viewDidLoad() {
      super.viewDidLoad()

      title = detailTitle

      // Make nav bar transparent
      navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
      navigationController?.navigationBar.shadowImage = UIImage()
      navigationController?.navigationBar.isTranslucent = true

      // Prevent large title
      navigationController?.navigationBar.prefersLargeTitles = false
  }

}

【问题讨论】:

  • 尝试在 ViewWillAppear() 中的 HomeViewController 中设置“true”
  • 谢谢!它有效,但仍然存在我在帖子中描述的问题。当我回击返回 HomeViewController 时,标题最初显示为小,然后逐渐变大。我试图让它第一次出现时变大。

标签: ios swift xcode uitableview uiviewcontroller


【解决方案1】:

您需要在主视图控制器的viewWillAppear 中将navigationController?.navigationBar.prefersLargeTitles 设置为true,以使其每次返回主视图时都运行。

您可以在细节的viewWillAppear 中将其设置为false,并在细节的viewWillDisappear 中将其还原,以防止它也保持为false。

DetailVC 的代码:

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

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

【讨论】:

  • 谢谢!这也有效,但是当返回 HomeViewController 时,标题仍然“Home”显示为小,然后逐渐变大。我试图让它在最初出现时变大。
  • 如果我只是将标题从 HomeViewController 上的导航栏中取出,并使用标签代替标题,我会不会有更好的运气?这样返回 HomeViewController 是否顺畅?我希望我可以发布它正在做什么的 gif。
  • 如果这样做,您将无法在导航到详细信息时实现标题变小和向上滑动的平滑过渡。您可以像@Sam 提到的那样在详细视图控制器中设置self.navigationItem.largeTitleDisplayMode = .never
【解决方案2】:

试试这个它的工作。 在'HomeViewController'中

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
}

在'DetailViewController'中

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.largeTitleDisplayMode = .never
}

【讨论】:

  • 是的!谢谢你。那快把我逼疯了。再次感谢
  • 感谢投票并接受,这样它也会帮助其他人。
  • 它不允许我投票,但我点击了绿色复选标记!
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多