43

我正在尝试在我的新应用程序上实现 iOS 11 原生大型导航栏标题。通过在 viewDidLoad() 中调用以下函数:

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

我确实得到了我想要的。 在此处输入图像描述

但是,当我开始向上滚动时(主视图内的唯一视图是滚动视图),滚动使大标题消失的速度比用手指实际滚动的速度更快。(也就是说,如果我在屏幕上移动 2 厘米,滚动视图实际上会滚动超过 2 厘米,直到大标题缩小到“通​​常”大小。)

下面是我的应用正在滚动的 gif。我实际上很少移动,它会自动向上滚动那么多。这与 Apple 制造的应用程序(例如应用程序商店,显示在我的应用程序下方)不同。

有没有人有解决这种异常行为的方法?

在此处输入图像描述

在此处输入图像描述

编辑:根据请求,我正在添加当前的视图层次结构。我的代码没有什么特别之处,我只是为prefersLargeTitles.

在此处输入图像描述

4

6 回答 6

48

我用这些约束解决了这个问题:

    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: view.topAnchor),
        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
        ])

您还必须在 UIViewController 子类上设置此属性:

extendedLayoutIncludesOpaqueBars = YES
于 2018-01-18T12:31:10.393 回答
35

我也发现了这个问题。

在界面生成器中

  1. 选择你的“viewController”
  2. 属性检查器勾选“Under Opaque Bars”和“Under Top Bars”
  3. 将您的 scrollView 第二个项目的最高限制设置为“SuperView”而不是“SafeArea”
于 2018-05-04T08:55:08.730 回答
9

我已经调试了几天,我找到了解决方法。

首先,发生了什么?

正是UIScrollViewlargeTitle 表现不佳。由于在滚动视图上滚动的同时导航栏变小,因此与实际滚动相比存在两倍的滚动。

我通过故意设置确认了这一点:

scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5

这确实使它随心所欲地移动。但是,这并不能解决整个问题,因为它在从大导航栏到小导航栏的过程中没有产生平滑的过渡。你可以试试下面的代码。

if scrollView.contentOffset.y > 0 {
  if self.navigationController!.navigationBar.frame.size.height > 44.0 {
    scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
  }
}

这在缓慢滚动时“还可以”,但是当您向下滑动时,它一开始动作很慢(当导航高度很大时),然后又加快了速度。

解决方法

简单地说,你不能使用UIScrollViewiOS 11 的大导航栏。你应该UITableViewController改用。
由于我的视图是由多个UICollectionViews沿垂直方向横向展开的视图组成,因此我使用UITableView不同的部分来使用情节提要来形成 UI。如果您使用UITableViewController,它会根据需要执行。
AppStore 和所有其他 Apple 制造的原生应用程序都必须这样做。

于 2017-12-07T01:19:08.993 回答
7

我发现当导航栏有大标题并且不透明时会发生这种情况。如果您使用的是 CollectionView 或 TableView,并且它被限制在安全区域或其超级视图中,那么它应该为您处理插图。

对于滚动视图,请查看 Apple 文档,有一些新变量(如contentInsetAdjustmentBehavior)用于 iOS 11 中引入的安全区域更改:https ://developer.apple.com/documentation/uikit/uiscrollview

使导航栏半透明

在 viewDidLoad() 中,尝试添加:

navigationController?.navigationBar.isTranslucent = true

或者在 IB 中设置这个复选标记:

半透明复选标记

于 2018-01-16T20:34:39.560 回答
5

首先,确保 scrollView 的 top 约束的第二项等于Superview.Top,而不是Safe Area

其次,将此行添加到您的视图控制器:extendedLayoutIncludesOpaqueBars = true. 例如在viewDidLoad.

于 2019-09-09T20:59:56.497 回答
5

双倍速度的问题可能是您的视图大小小于导航控制器视图大小并且您具有视图层次结构(您可以在视图调试器中检查它)

V:|-[navbar]-[view]-|

因此,当滚动视图的框架时,内容偏移量会发生变化,并且速度会加倍。

extendedLayoutIncludesOpaqueBars = true应该有帮助。

于 2018-02-13T16:24:11.750 回答