【问题标题】:iOS 11 large navigation bar title unexpected velocityiOS 11 大导航栏标题出乎意料的速度
【发布时间】:2018-05-18 20:43:40
【问题描述】:

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

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

我确实得到了我想要的。

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

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

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

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

【问题讨论】:

  • 我在模拟器上试过了。该行为比您自己的示例慢。 App Store 的 scrollView 动画也是如此。如果我滚动到顶部直到看不到大标题的一半,它会自动滚动到最高点。这不是您期望看到的行为吗?
  • @DorukhanArslan,当手指还在屏幕上时,App Store 的 scrollView,你可以在任何时候停下来,直到你松开。但在我的应用程序中,即使我的手指在屏幕上,它也会自动滚动到顶部。
  • @DorukhanArslan 为了提供更多信息,向下滚动内容(即向上移动手指)会导致标题的突然、快速更改,而向上滚动内容(即向下移动手指)的行为符合预期。
  • @DorukhanArslan 我添加了视图层次结构!

标签: ios swift uinavigationbar ios11 large-title


【解决方案1】:

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

    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

【讨论】:

  • 我只需要设置extendedLayoutIncludesOpaqueBars 就可以了。谢谢你。我什至不知道这个属性。
  • extendedLayoutIncludesOpaqueBars = YES 做到了。谢谢。
  • 太棒了!!我也只用过房产!
  • 当该属性设置得太真实时,外观和感觉的昼夜差异!
  • 当为子视图控制器使用容器视图时,我通过将此容器视图的约束附加到父视图而不是安全区域来解决它。我从您的回答中得到了这个想法,非常感谢! :)
【解决方案2】:

我也发现了这个问题。

在界面生成器中

  1. 选择您的“viewController”
  2. 属性检查器勾选“Under Opaque Bars”和“Under Top Bars”
  3. 将您的 scrollView 第二个项目的最高约束设置为“SuperView”而不是“SafeArea”

【讨论】:

  • 第 3 项为我做了。
  • 第 3 项也为我做到了
  • 2 和 3 都是必需的。谢谢!它现在正在工作。
【解决方案3】:

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

首先,发生了什么事?

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

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

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 制造的原生应用程序都必须这样做。

【讨论】:

  • 我在 UITableView 中也遇到了同样的问题,标题很大,有什么解决办法吗?
  • @barbarity 我在写上面的答案时犯了一个错误。当您使用 UITableViewController,而不是 UIViewController 中的 UITableView 时,它可以工作。 (将修复上面的答案)
  • 不错的发现!这整个大标题的导航栏真是一个可耻的、漏洞百出的 API……
  • 当同时使用 UITableViewController 和 UISerchController 时也会出现此错误。所以我们都同意大标题是非常错误的。我不知道 Whats App 是如何同时拥有 searchController 和平滑滚动的。
  • 我不同意这应该是批准的答案。有时需要滚动视图。这与此处提供的答案有类似的解决方案:stackoverflow.com/a/55523549/1909108
【解决方案4】:

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

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

使导航栏半透明

在 viewDidLoad() 中,尝试添加:

navigationController?.navigationBar.isTranslucent = true

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

translucent checkmark

【讨论】:

  • 您可以通过显示一些代码来改进您的答案,这将使其他人更容易确定您的答案是否有帮助
  • 只是说,集合/表格视图滚动视图,因此它们具有相同的属性。
  • 是的,这是真的,这就是我链接到滚动视图文档的原因:)
【解决方案5】:

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

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

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

extendedLayoutIncludesOpaqueBars = true 应该会有所帮助。

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多