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

iOS 11大导航栏标题意外速度,ios,swift,uinavigationbar,ios11,large-title,Ios,Swift,Uinavigationbar,Ios11,Large Title,我正在尝试在我的新应用程序上实现iOS 11本机大型导航栏标题。通过在viewDidLoad()中调用以下函数: navigationController?.navigationBar.prefersLargeTitles=truenavigationController?.navigationItem.largeTitleDisplayMode=.always 我确实得到了我想要的。 但是,当我开始向上滚动时(主视图中唯一的视图是滚动视图),滚动使大标题以比用手指实际滚动更快的速度消失。(也

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

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

我确实得到了我想要的。

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

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

有人有解决这种异常行为的办法吗

编辑: 根据请求,我将添加当前视图层次结构。我的代码没有什么特别之处,我只是为
首选目标设置了标题和标志


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

首先,发生了什么事?

正是
UIScrollView
在LarGetTitle中表现不佳。由于随着导航栏变小,滚动视图上会同时向上滚动,因此存在两倍于实际滚动的滚动

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

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

由于我的视图由多个水平
uicollectionview
垂直分布组成,因此我使用带有不同部分的
UITableView
来使用故事板形成UI。 如果使用
UITableViewController
,它将根据需要执行。

AppStore和所有其他苹果制造的本地应用程序都必须这样做。

我发现当导航栏标题较大且不是半透明时会发生这种情况。如果您使用的是CollectionView或TableView,并且它被约束到安全区域或其superview,那么它应该为您处理插入

对于滚动视图,请查看Apple文档,iOS 11中引入的安全区域更改有一些新变量(如contentInsetAdjustmentBehavior):

使导航栏半透明

在viewDidLoad()中,尝试添加:

navigationController?.navigationBar.isTranslucent = true
或在IB中设置此复选标记:


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

    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

如果使用双速度,问题可能是视图大小小于导航控制器视图大小,并且视图层次结构类似(可以在视图调试器中检查)

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

所以,当滚动视图时,视图的帧在内容偏移的变化过程中发生变化,并且速度加倍


extendedlayoutincludesopaquebar=true
应该会有帮助。

我也发现了这个问题

在界面生成器中

  • 选择“视图控制器”
  • 属性检查器勾选“不透明条下”和“顶部条下”
  • 将scrollView的顶部约束设为“SuperView”而不是“SafeArea”的第二项

  • 首先,确保scrollView顶部约束的第二项等于
    Superview.top
    ,而不是
    安全区域


    其次,将这一行添加到视图控制器:
    extendedlayoutincludesopaquebar=true
    。例如,在
    viewdiload

    中,我在emulator上尝试了它。该行为比您自己的示例慢。AppStore的scrollView动画也是如此。如果我滚动到顶部,直到看不到大标题的一半,它会自动滚动到最顶端。这不是你期望看到的行为吗?@DorukhanArslan,应用商店的滚动视图,当finger还在屏幕上时,你可以在任何时候停下来,直到你放开为止。但在我的应用程序中,即使我的手指在屏幕上,它也会自动滚动到顶部。@DorukhanArslan为了提供更多的信息,向下滚动内容(即向上移动手指)会使标题突然快速更改,同时向上滚动内容(即向下移动手指)行为符合预期。@DorukhanArslan我添加了视图层次结构!可能重复的我在UITableView中也遇到了同样的问题,标题很大,有什么解决办法吗?@barbarity我在写上面的答案时犯了一个错误。当您使用UITableViewController,而不是UIViewController内部的UITableView时,它会起作用。(将修复上面的答案)很好的发现!整个大标题导航栏是一个非常可耻的、有缺陷的API……当使用与UISerchController匹配的UITableViewController时,也会出现此缺陷。所以我们都同意,大标题是非常错误的。我不知道;我不知道Whats应用程序是如何同时拥有搜索控制器和平滑滚动的。我不同意这应该是认可的答案。有时需要滚动视图。这与这里提供的答案有一个类似的解决方案:您可以通过显示一些代码来改进您的答案,以实现这一点,这将使其他人更容易决定您的答案是否有用,也就是说,集合/表视图