1. ホーム
  2. ios

[解決済み] iOS11でuitableviewが変な挙動をする。ナビゲーションプッシュアニメーションでセルがスクロールアップする

2022-08-25 03:18:06

質問

最近、いくつかのコードを新しい iOS 11 beta 5 SDK に移行しました。

私は今、UITableViewから非常に混乱した挙動を得ます。テーブルビュー自体はそれほど派手ではありません。私はカスタムセルを持ちますが、ほとんどの場合、それは高さのためだけです。

テーブルビューでビューコントローラをプッシュすると、プッシュ/ポップナビゲーションアニメーションに沿って、セルが "スクロールアップ"(またはおそらくテーブルビューフレーム全体が変化する)およびダウンする追加アニメーションが表示されます。gifを参照してください。

私は手動で tableviewloadView メソッドを使用して、テーブルビューのスーパービューの先頭、末尾、上、下と同じになるように自動レイアウト制約を設定します。スーパービューとは、ビューコントローラのルートビューのことです。

ビューコントローラのプッシングコードは非常に標準的なものです。 self.navigationController?.pushViewController(notifVC, animated: true)

同じコードでiOS 10では正常な動作が得られます。

何が間違っているのか、方向性を示していただけないでしょうか。

EDIT: 非常にシンプルなテーブルビューコントローラを作成し、そこで同じ挙動を再現することができました。コードです。

class VerySimpleTableViewController : UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }


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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }


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

        cell.textLabel?.text = String(indexPath.row)
        cell.accessoryType = .disclosureIndicator

        return cell
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        let vc = VerySimpleTableViewController.init(style: .grouped)

        self.navigationController?.pushViewController(vc, animated: true)
    }
}

EDIT 2: UINavigationBarのカスタマイズに問題があることを突き止めました。私はこのようにカスタマイズしています。

rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)

ここで createFilledImage は、指定されたサイズと色で正方形の画像を作成する。

この行をコメントアウトすると、通常の動作に戻ります。

この件に関して何かご意見がありましたらお願いします。

どのように解決するのですか?

この原因は UIScrollView's (UITableViewはUIScrollviewのサブクラスです) 新しい contentInsetAdjustmentBehavior プロパティが設定され .automatic に設定されています。

影響を受けるコントローラの viewDidLoad において、以下のスニペットでこの動作をオーバーライドすることができます。

    tableView.contentInsetAdjustmentBehavior = .never

https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior