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
}
}
ナビゲーションバーにはPreferreds Large Titlesがチェックされ、ナビゲーションアイテムにはLarge Title自動に設定します。
上記の両方の例のコードと構成は、UITableViewControllerとUIViewController内のUITableViewの場合を除き、まったく同じです。
また、UITableViewのコンテンツがビューの高さを超えない場合、壊れた動作が発生しないことも確認しました。しかし、画面に収まらないほど多くのセルがあると、壊れます。
私が何か間違ったことをしているのか、これがiOS 11のバグであるのかはわかりませんか?
私は同じ問題に直面しました-UIViewController
にUINavigationController
が埋め込まれていました。UIViewController
には、safe areaへの先頭、末尾、上部、下部の制約を持つテーブルビューがありました。テーブルビュー全体がびくびく/てきぱきと振る舞いました。秘Theは、tableviewの一番上の制約をsuperviewに変更することでした。
ここで、制約の変更を記録しました tableview iOS 11バグ制約の変更
このコード行をUITableViewを含むUIViewControllerに配置してください。
Swift
extendedLayoutIncludesOpaqueBars = true;
Objective-C
self.extendedLayoutIncludesOpaqueBars = YES;
UITableView AutoLayoutの上部スペースを「セーフエリア」ではなく「スーパービュー」に設定します
Interface Builderで:
それは私と一緒に働いた。
似たような問題があり、AppDelegateからUINavigationBar.appearance().isTranslucent = false
を削除して解決しました。
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
にあります。