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

时间:2017-12-05 08:45:16

标签: ios swift uinavigationbar ios11 large-title

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

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

我得到了我想要的东西。 enter image description here

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

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

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

enter image description here

enter image description here

编辑: 根据请求,我添加了当前的View层次结构。我的代码中没有任何特殊内容,我只为prefersLargeTitles设置了标题和标记。

enter image description here

6 个答案:

答案 0 :(得分:32)

我用这些限制解决了这个问题:

    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

答案 1 :(得分:15)

我也发现了这个问题。

在Interface Builder中

  1. 选择您的" viewController"
  2. 属性检查员勾选"在不透明栏下"和#34;在顶栏"
  3. 将你的scrollView第二项的顶级约束设置为" SuperView"不是" SafeArea"

答案 2 :(得分:7)

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

首先,发生了什么?

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

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

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
  }
}

这很有效'好的'当你慢慢滚动时,但是当你向下飞行时,它首先行动缓慢(导航高度很大),然后加速。

解决方法

简单地说,您不能将UIScrollView与iOS 11大导航栏一起使用。您应该使用UITableViewController代替 由于我的视图由垂直方向上的多个水平UICollectionViews分布组成,因此我使用UITableView使用不同的部分来使用故事板形成UI。 如果您使用UITableViewController,则会根据需要执行 AppStore和所有其他Apple制造的本机应用程序必须这样做。

答案 3 :(得分:6)

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

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

使导航栏半透明

在viewDidLoad()中,尝试添加:

navigationController?.navigationBar.isTranslucent = true

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

translucent checkmark

答案 4 :(得分:4)

双速度情况下的问题可能是您的视图大小小于导航控制器视图大小,并且您有类似的视图(可以在视图调试器中查看)

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

所以当滚动你的视图时,在更改内容偏移期间帧的变化会使速度加倍。

extendedLayoutIncludesOpaqueBars = true应该有帮助。

答案 5 :(得分:1)

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

第二,将此行添加到视图控制器:extendedLayoutIncludesOpaqueBars = true。例如在viewDidLoad中。