iOS 11大标题导航栏快照而不是平滑过渡

时间:2017-12-31 00:34:00

标签: swift xcode uitableview uiviewcontroller ios11

我遇到一个问题,当在UIViewController内部嵌入的UITableView上滚动时,大标题导航栏会突然崩溃。问题似乎只发生在屏幕上向上滚动时。当在屏幕上向下滚动时,标题会平滑过渡到再次变大,但反之则不然。

如果使用UITableViewController,则不会发生此问题。

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

iOS 11 UITableView inside of a UIViewController (broken abrupt transition when scrolling)

在UIViewController中使用UITableView时,这是一个破碎的突然转换。

iOS 11 UITableViewController (transitioning properly)

以下是破解实施的代码:

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的错误吗?

5 个答案:

答案 0 :(得分:30)

我遇到了同样的问题 - 我在UINavigationController中嵌入了UIViewController,UIViewController的tableview具有安全区域的前导,尾随,顶部,底部约束。整个tableview表现得很好/有趣。诀窍是将tableview的顶级约束更改为 superview

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

答案 1 :(得分:25)

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

夫特

extendedLayoutIncludesOpaqueBars = true;

目标-C

self.extendedLayoutIncludesOpaqueBars = YES;

将UITableView AutoLayout顶部空间设置为" Superview"而不是"安全区"

答案 2 :(得分:2)

我有一个类似的问题并通过删除UINavigationBar.appearance().isTranslucent = false解决了这个问题 来自我的AppDelegate。

答案 3 :(得分:0)

在Interface Builder中:

  1. 选择您的“ viewController”。
  2. 属性检查器在“不透明条下”和“顶部下条”上打勾。
  3. 将您的scrollView第二个项目的主要约束设置为“ SuperView”而不是“ SafeArea”。

它与我合作。

Reference

答案 4 :(得分:0)

Soolar的回答是正确的,但我不知道如何在情节提要中修复它。最后,我通过添加以下内容解决了罗马式解决方案的问题:

    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://stackoverflow.com/a/48321447/1386369