iOS 11更喜欢大标题,直到滚动才更新

问题描述 投票:23回答:18

我实现了一个带有UITableView的基本UIViewController,它包含在UINavigationController中。我将prefersLargeTitles设置为true:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.title = "Coffees"
}

但是,标题保持很小,直到我滚动视图,此时它会放大。我尝试将该调用移动到我创建UINavigationController的位置,但没有效果。当我设置prefersLargeTitles时,我确信navigationController不是nil。

我应该在其他地方更新该房产吗?或者我应该提交雷达?

更新:

如果我的观点包含UITableView或本身就是UITableViewController,这似乎只会发生

ios swift cocoa-touch uinavigationcontroller uikit
18个回答
19
投票

我有同样的问题。虽然你没有使用故事板,但我希望这可以帮助某人。我检查了导航控制器(不是视图控制器)的“首选大标题”我嵌入了我的TableViewController。导航控制器转动后所有的视图控制器都有大标题,它应该可以工作。


1
投票

我浪费了相当多的时间在这上面,因为viewWillAppear(_:) saga在预期的某些视图控制器上运行,并且有些它产生了相同的问题。

我的解决方案是取消选中IB中顶部栏下的扩展边缘 - 对于那些在表格视图的内容加载之前暂时显示大标题的视图控制器,导航栏会跳回到常规大小。它只在向下滚动表格视图时显示大标题。

这与iOS 10向后兼容,并且不会在表视图的第一行上方留下任何空白空间。

我只在IB中检查了导航控制器属性检查器上的override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.prefersLargeTitles = true } - 代码中没有任何内容。 prefersLargeTitle也是如此

至于为什么一些视图控制器而不是其他视图控制器发生这种情况,我绝对不知道!


1
投票

我通过故事板解决了这个问题

  1. 导航控制器 - >导航栏 - >属性检查器 - >喜欢大标题(选中)
  2. View Controller - > Navigation Item - > Attributes inspector - > Large Title(Automatic or Always checked)

0
投票

这看起来确实像一个奇怪的行为,但尝试将prefersLargeTitle设置为largeTitleDisplayMode = .always。默认值为navigationItem.largeTitleDisplayMode - 并且没有定义always中的工作原理。

还写了/将更新关于大型标题automatic的答案。


0
投票

我有类似的问题。视图是表格视图。 docs的财产位于here活动。然后我在prefersLargeTitles事件中设置了视图的标题。

viewDidLoad

在我的准备segue事件中,我将导航项目的磁贴设置为viewWillAppear,以便下一个视图左侧导航变量项目自动显示“返回”。

override open func viewDidLoad() {
   if #available(iOS 11.0, *) {
        self.navigationController?.navigationBar.prefersLargeTitles = true
    } else {
        // Fallback on earlier versions
    }
    ...
}

override open func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "something"
    ...
}

表视图第一次正确显示大标题。但是,如果我选择一行到下一个视图并返回到表视图,则导航项的标题将变为空。

经过几个小时的挣扎,我终于发现视图的标题应该在nil事件中设置!似乎在override func prepare(for segue: UIStoryboardSegue, sender: Any?) { self.navigationItem.title = nil ... } 事件中设置查看标题的任何设置都将被UIKit内部重置为零。所以它必须设置在不同的事件中。

viewDidAppear

在我介绍这个iOS 11新功能之前,我的应用运行正常。似乎新功能在UIKit中有一些变化,因此以前的版本应用程序可能需要一些更新/更改才能使其正常工作。


0
投票

我遇到了同样的问题,并通过在InterfaceBuilder中更改ViewController中的视图顺序来修复它。

看起来如果Hierarchy中的第一个视图不是ScrollView,那么NavigationBar会以LargeTitle模式显示,并且不会与滚动视图一起动画。如果需要导航栏标题以反映滚动,则需要将滚动视图作为视图层次结构中的第一个。

此外,我不完全确定这一点,但看起来像标准或大标题模式中的导航栏外观取决于以前的控制器的视图层次结构。


0
投票

类似的问题对我来说Will添加到override func viewDidAppear(_ animated: Bool) { self.navigationItem.title = "something" ... } override open func viewWillAppear(_ animated: Bool) { // self.navigationItem.title = "something" // Remove it and set title in Did event! ... } 。在我的实例中,这些视图控制器本身嵌入在UITableViewController中,只有正确显示的第一个选项卡才使用大标题。其他选项卡需要手动滚动才能显示大标题。

我唯一可以上班的是根据@ pau-senabre的答案调整UIViewController,除了我UITabBarController插图对我没有帮助。相反,我设置了contentInset插入,然后在下一个runloop重置它。

top

0
投票

另一种可能的解决方案是在refreshHandler()中结束刷新。像这样-

left

0
投票

与Swift 4.2,iOS 12和重构的Storyboard相同的问题。

尝试将private var isFirstAppearance = true override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if isFirstAppearance { applyLargeTitlesFix() } } private func applyLargeTitlesFix() { let originalInset = tableViewController.tableView.contentInset tableViewController.tableView.contentInset = UIEdgeInsets(top: 0, left: 1, bottom: 0, right: 0) DispatchQueue.main.async { [weak self] in self?.tableViewController.tableView.contentInset = originalInset } isFirstAppearance = false } 添加到@objc func refreshPage() { self.refreshControl?.endRefreshing() //End here self.loadTableData() //Get fresh data and reload table } prefersLargeTitles = true,但都没有解决我的问题。

相反,我将重构的故事板复制回main.storyboard,并找到了在IB中启用大型游戏的选项。设置该选项,然后重新构建故事板,现在一切正常。由于某种原因,最初的重构剥离了选项,我无法以编程方式启用它。


0
投票

编程方式:

  1. 在AppDelegate.swift中: viewWillAppear
  2. 在ViewController中: 覆盖func viewWillAppear(_ animated:Bool){super.viewWillAppear(animated) viewDidLoad } override func loadView(){super.loadView() window = UIWindow(frame: UIScreen.main.bounds) window?.makeKeyAndVisible() let navigationController = UINavigationController.init(rootViewController: ViewController()) window?.rootViewController = navigationController }

请确保您的桌面视图首先添加到您的视图中!


9
投票

我只在一个tableview上遇到同样的问题......

我必须设置:

self.tableView.contentInsetAdjustmentBehavior = .never

这样我的tableview在加载uiviewcontroller时停止滚动。

这是tableview自动滚动,可以隐藏大标题

希望这可以帮助


6
投票

我最近遇到了同样的问题,没有一个建议对我有用。相反,我需要做的就是调用sizeToFit()。示例代码:

private func configureNavigator() {
    guard let navigationController = navigationController else { return }
    navigationController.navigationBar.prefersLargeTitles = true
    navigationItem.largeTitleDisplayMode = .automatic
    navigationController.navigationBar.sizeToFit()
}

我希望这有帮助!


4
投票

使用top:1修改tableView的contentInset将强制导航栏展开并显示大标题。

OBJ-C

-(void) viewWillAppear:(BOOL)animated {
    if (@available(iOS 11.0, *)) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0);
    }
}

迅速

override func viewWillAppear(_ animated: Bool) {
    if #available(iOS 11.0, *) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0)
    }
}

注意:如果tableView.reloadData()中有viewWillAppear,请务必在编辑contentInset后调用它


3
投票

在我的情况下,解决方案是将tableView的顶部对齐设置为Safe Area而不是Superview


1
投票

在故事板中,我将导航项目qazxsw poi设置为qazxsw poi。

在我的ViewController的viewDidLoad方法中,我设置了以下内容:

Large Title

1
投票

我刚刚遇到了同样的问题,在我的情况下,事实证明,在iOS 10中使用Swift 3(也适用于带有Swift 3的iOS 11)的Storyboard结构导致了iOS 11与Swift 4的问题。

详细说明:

我在我的故事板中有一个常规的UIViewController我已经设置为UINavigationController子类(我的层次结构类似于你的,UITabBarController子类→UINavigationController子类→UITableViewController子类)。

在iOS 10中,这很好用。

在iOS 11中,当您运行现有的Swift 3应用程序时,这也可以正常工作。

但是,使用在iOS 11上运行的Swift 4应用程序,我看到了您描述的相同症状(仅当您向下拉/向下滚动视图时才会显示大型标题)。

为了解决这个问题,我用实际的UINavigationController实例替换了故事板中基于UIViewController的元素(在Storyboard中显式包含UINavigationBar - 我有一个预感,这是问题的关键所在,因为UIViewController实例没有在Storyboard中明确声明的那个元素)。

无论如何,这为我解决了这个问题。

我将归档雷达,因为这看起来像基于Swift 4的回归,因为对我来说,它适用于iOS 10和Swift 3以及iOS 11和Swift 3。


1
投票

我遇到了同样的问题,发现通常最好从视图控制器或设置它的对象设置Never属性,并在它出现之前这样做。

例如,如果在应用启动时显示有问题的视图控制器:

navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always

或者如果呈现特定的视图控制器:

prefersLargeTitles

我发现这种方法是一种更加可靠的方法,可以确保相应地显示导航标题。希望这可以帮助! :)


1
投票

一般改变func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let window = UIWindow(frame: UIScreen.main.bounds) let someViewController: UIViewController = CustomViewController() let theNavController = UINavigationController(rootViewController: someViewController) theNavController.navigationBar.prefersLargeTitles = true window.rootViewController = theNavController window.makeKeyAndVisible() return true } 的行为应该在let someViewController: UIViewController = CustomViewController() let theNavController = UINavigationController(rootViewController: someViewController) theNavController.navigationBar.prefersLargeTitles = true present(theNavController, animated: true, completion: nil) 完成

navigationBar

在这之后,它对我来说很好。

© www.soinside.com 2019 - 2024. All rights reserved.