iOS 11大导航栏标题意外速度

Seo*_*oon 38 uinavigationbar ios swift ios11 large-title

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

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

我得到了我想要的东西. 在此输入图像描述

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

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

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

在此输入图像描述

在此输入图像描述

编辑:每个请求,我添加当前的视图层次结构.我的代码中没有任何特殊内容,我只需设置标题和标记即可prefersLargeTitles.

在此输入图像描述

Rom*_*man 38

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

    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)
        ])
Run Code Online (Sandbox Code Playgroud)

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

extendedLayoutIncludesOpaqueBars = YES
Run Code Online (Sandbox Code Playgroud)

  • 我只需要设置`extendedLayoutIncludesOpaqueBars`,我很高兴.谢谢.我甚至都不知道这个属性. (8认同)
  • 当将容器视图用于子视图控制器时,我通过将此容器视图的约束附加到超级视图而不是安全区域来解决它。我从你的回答中得到了这个想法,非常感谢!:) (2认同)

use*_*708 23

我也发现了这个问题.

在Interface Builder中

  1. 选择你的"viewController"
  2. 属性检查器勾选"在不透明的条形图下"和"在顶部条形图下"
  3. 将您的scrollView第二项的顶级约束设置为"SuperView"而不是"SafeArea"

  • 第3项为我做了. (2认同)

Seo*_*oon 9

我已经调试了几天,我找到了一个解决方法.

首先,发生了什么?

这是UIScrollView一个不与该largeTitle表现良好.由于在导航栏变小的同时在滚动视图上向上滚动,因此与实际滚动相比,滚动存在两倍.

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

scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
Run Code Online (Sandbox Code Playgroud)

这确实使它按照需要移动.但是,这无法解决问题的整个问题,因为从大导航栏到小导航栏时它并没有产生平滑过渡.您可以尝试以下代码.

if scrollView.contentOffset.y > 0 {
  if self.navigationController!.navigationBar.frame.size.height > 44.0 {
    scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
  }
}
Run Code Online (Sandbox Code Playgroud)

当你慢慢滚动时,这个工作"没问题",但是当你向下飞行时,它首先行动缓慢(导航高度很大),然后加速.

替代方法

简而言之,您不能使用UIScrollViewiOS 11大导航栏.你应该用UITableViewController.
由于我的视图由UICollectionViews垂直方向上的多个水平展开组成,因此我使用UITableView不同的部分来使用故事板形成UI.如果您使用UITableViewController,它会根据需要执行.
AppStore和所有其他Apple制作的本机应用程序必须这样做.


JWh*_*tey 6

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

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

使导航栏半透明

在viewDidLoad()中,尝试添加:

navigationController?.navigationBar.isTranslucent = true
Run Code Online (Sandbox Code Playgroud)

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

半透明的复选标记


小智 6

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

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

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

extendedLayoutIncludesOpaqueBars = true 应该有所帮助。


小智 5

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

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