web-dev-qa-db-ja.com

iOS 11の大きなタイトルナビゲーションバーは、スムーズな移行ではなくスナップします

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
    }

}

ナビゲーションバーにはPreferreds Large Titlesがチェックされ、ナビゲーションアイテムにはLarge Title自動に設定します。

上記の両方の例のコードと構成は、UITableViewControllerとUIViewController内のUITableViewの場合を除き、まったく同じです。

また、UITableViewのコンテンツがビューの高さを超えない場合、壊れた動作が発生しないことも確認しました。しかし、画面に収まらないほど多くのセルがあると、壊れます。

私が何か間違ったことをしているのか、これがiOS 11のバグであるのかはわかりませんか?

24
Villarrealized

私は同じ問題に直面しました-UIViewControllerUINavigationControllerが埋め込まれていました。UIViewControllerには、safe areaへの先頭、末尾、上部、下部の制約を持つテーブルビューがありました。テーブルビュー全体がびくびく/てきぱきと振る舞いました。秘Theは、tableviewの一番上の制約をsuperviewに変更することでした。

ここで、制約の変更を記録しました tableview iOS 11バグ制約の変更

36
Soolar

このコード行をUITableViewを含むUIViewControllerに配置してください。

Swift

extendedLayoutIncludesOpaqueBars = true;

Objective-C

self.extendedLayoutIncludesOpaqueBars = YES;

UITableView AutoLayoutの上部スペースを「セーフエリア」ではなく「スーパービュー」に設定します

28
Filippo

Interface Builderで:

  1. 「viewController」を選択します。
  2. 属性インスペクターの「不透明バーの下」および「上部バーの下」にチェックマークを付けます。
  3. ScrollViewの2番目のアイテムの最上位の制約を「SafeArea」ではなく「SuperView」にします。

それは私と一緒に働いた。

参照

2
FarouK

似たような問題があり、AppDelegateからUINavigationBar.appearance().isTranslucent = falseを削除して解決しました。

2
fl034

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

0
Yongqiang Zhou