iOS 11 大标题导航栏捕捉而不是平滑过渡

Posted

技术标签:

【中文标题】iOS 11 大标题导航栏捕捉而不是平滑过渡【英文标题】:iOS 11 large title navigation bar snaps instead of smooth transition 【发布时间】:2018-06-10 20:45:42 【问题描述】:

我遇到了一个问题,即在嵌入 UIViewController 的 UITableView 上滚动时,大标题导航栏会非常突然地折叠。该问题似乎仅在向上滚动屏幕时发生。在屏幕上向下滚动时,标题会平滑过渡到再次变大,但反之则不然。

如果使用 UITableViewController,则不会出现此问题。

这是在 UITableViewController 内滚动时的正常预期行为。

这是在 UIViewController 中使用 UITableView 时出现的中断、突然的过渡。

这是损坏的实现的代码:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 12
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Basic", for: indexPath)

        cell.textLabel?.text = "Title \(indexPath.row)"

        return cell
    


导航栏已选中首选大标题,并且导航项已将大标题设置为自动。

上面两个示例的代码和配置完全相同,除了一个是 UITableViewController 与 UIViewController 内的 UITableView。

我还观察到,如果 UITableView 的内容不超过视图的高度,则不会发生损坏的行为。但一旦单元格数量超出屏幕显示范围,它就会中断。

知道我做错了什么还是 ios 11 的错误?

【问题讨论】:

您如何配置导航栏?故事板,以编程方式?你能显示选项或代码吗? 我认为 UITableViewController 的实现可以正确处理这种行为。 @barbarity 我用更多信息编辑了我的 OP。 @AndyC 那里有相关文档吗? 哦,不。你完全正确。当内容大于屏幕时,它会突然折叠。我会调查 【参考方案1】:

我遇到了同样的问题 - 我在 UINavigationController 中嵌入了 UIViewControllerUIViewController 的 tableview 具有对安全区域的前导、尾随、顶部、底部约束。整个 tableview 表现得跳跃/活泼。诀窍是将 tableview 的顶部约束更改为 superview

这里我记录了改变约束 tableview iOS 11 bug constraint change

【讨论】:

谢谢!我对此进行了测试,并且可以正常工作。将 UITableView 的顶部约束更改为引用 UIViewController 的 Superview 而不是 Safe Area,现在它很流畅!我觉得这仍然是Apple的一个错误?或者需要有关于它的文档。 太棒了。将 collectionView 固定到安全的顶部锚点,并更改为 view.topAnchor 解决了该问题。谢谢 我在 XIB 的 viewController 中使用集合视图并将约束设置为 superview 但仍然面临同样的问题。它表现得跳跃/活泼。有什么解决办法吗? 我正在尝试为 UITableViewController 中的表格视图修复此问题,但我无法更改情节提要中表格视图的约束。我必须使用 UIViewController 并添加自己的表格视图吗?表格视图包含动态单元格。我尝试使用 NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.superview!.topAnchor)]) 在 vi​​ewWillAppear() 中以编程方式更改它,但这没有效果。 非常感谢您的回答。让我头疼不已。【参考方案2】:

将这行代码放在包含 UITableView 的 UIViewController 上 对我来说很好用。

斯威夫特

extendedLayoutIncludesOpaqueBars = true;

目标-C

self.extendedLayoutIncludesOpaqueBars = YES;

将 UITableView AutoLayout 顶部空间设置为“Superview”而不是“Safe Area”

【讨论】:

这行得通,谢谢!无论您是在 UIViewController 中使用 UITableView 还是将 UITableViewController 作为子视图控制器,这似乎都可以解决问题。 当我的导航控制器包含在选项卡控制器中时,这会导致我的安全区域出现问题。有了这个,我的表格视图不考虑标签栏创建的底部安全区域。 @Connor 除了extendedLayoutIncludesOpaqueBars,还可以用edgesForExtendedLayout指定哪些边被扩展; ==> extendedLayoutIncludesOpaqueBars = true edgesForExtendedLayout = [.top]【参考方案3】:

我遇到了类似的问题并通过删除 UINavigationBar.appearance().isTranslucent = false 解决了它 来自我的 AppDelegate。

更新:如果你不想要半透明,你应该启用extendedLayoutIncludesOpaqueBars。这样所有的故障都得到了修复。

【讨论】:

我可以确认这可以解决问题。这太糟糕了。我想要一个非半透明的导航栏。 取消选中半透明后会出现弹跳效果。【参考方案4】:

在界面生成器中:

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

它对我有用。

Reference

【讨论】:

【参考方案5】:

Solar 的回答是正确的,但我不知道如何在情节提要中修复它。最后我在另一个问题中用 Roman 的解决方案解决了这个问题,添加:

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)
])

viewDidLoad.

原答案:https://***.com/a/48321447/1386369

【讨论】:

以上是关于iOS 11 大标题导航栏捕捉而不是平滑过渡的主要内容,如果未能解决你的问题,请参考以下文章

如何在 html 导航栏点击之间获得平滑过渡

从自定义大标题导航栏过渡到常规导航栏时出现黑框

iOS11导航栏问题

iOS - 方向更改时导航栏不显示大标题

推送/弹出期间类似消息的更高/标准导航栏

如何在 iOS 11 的导航栏上设置大标题?