我正在尝试在我的新应用程序上实现iOS 11本机大导航栏标题。通过在viewDidLoad()中调用以下函数:
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationItem.largeTitleDisplayMode = .always
但是,当我开始向上滚动时(主视图中的唯一视图是滚动视图),滚动使大标题以比手指实际滚动更快的速度消失。 (也就是说,如果我在屏幕上移动2厘米,滚动视图实际滚动超过2厘米,直到大标题收缩到“通常”大小。)
以下是我的应用滚动的gif。我实际上移动很少,它会自动滚动那么多。这与Apple制造的应用程序(例如,应用程序商店,显示在我的应用程序下方)不同。
有没有人有办法解决这种异常行为?
编辑:
根据请求,我添加了当前的View层次结构。我的代码中没有任何特殊内容,我只为prefersLargeTitles
设置了标题和标记。
答案 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中
答案 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中设置此复选标记:
答案 4 :(得分:4)
双速度情况下的问题可能是您的视图大小小于导航控制器视图大小,并且您有类似的视图(可以在视图调试器中查看)
V:|-[navbar]-[view]-|
所以当滚动你的视图时,在更改内容偏移期间帧的变化会使速度加倍。
extendedLayoutIncludesOpaqueBars = true
应该有帮助。
答案 5 :(得分:1)
首先,请确保scrollView的顶部约束的第二项等于Superview.Top
,而不是Safe Area
。
第二,将此行添加到视图控制器:extendedLayoutIncludesOpaqueBars = true
。例如在viewDidLoad
中。