しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

iOS11 & Xcode9 で UINavigationController の pushViewController が斜めになる問題対策

push遷移アニメーションが下のように斜めになってしまったので対策を調べてみました。

f:id:llcc:20170922131817g:plain

stackoverflowによると、遷移先のviewDidLoadでtableViewのcontentInsetAdjustmentBehaviorを.neverにすれば良いとのことでした。
popViewControllerの時のアニメーションは遷移元のcontentInsetAdjustmentBehaviorによるので、遷移先・遷移元の両方でセットすると良いかと思います。

if #available(iOS 11.0, *) {
    tableView.contentInsetAdjustmentBehavior = .never
}

1つ1つのtableViewに設定するのが大変な時は、appearanceで設定すれば一括変更されます。

if #available(iOS 11.0, *) {
     UITableView.appearance().contentInsetAdjustmentBehavior = .never
}

それとこちらの現象はUITableViewStyleがgroupedでもplainでも発生するようです。

f:id:llcc:20170922132607g:plain

Xcode9で新規作成したアプリではこの現象は発生しませんでした。
比較したところ、adjustedContentInsetというreadonlyプロパティーの値が違っていました。
今回は調べきれなかったのですが、adjustedContentInsetの値を変更すればcontentInsetAdjustmentBehaviorを使わずに対応できるかもしれません。

print(tableView.adjustedContentInset) // → Xcode9で作成したアプリはtopに64が入ってた、Xcode8以前で作成したアプリのtopは0だった

2017/10/13追記

下の方法ですが、UITableViewがタブバーやツールバーと被ってしまうという問題があるようです。
なので下方法を使う場合はUITableViewのtableFooterViewに何か置くなどの対処が必要になりそうです。

if #available(iOS 11.0, *) {
     UITableView.appearance().contentInsetAdjustmentBehavior = .never
}

f:id:llcc:20171013143110p:plain

それと新規アプリがpushViewControllerで斜めにならないのはUINavigationBarのisTranslucentをtrueにしていたからでした。
この値をfalseにするとpushViewControllerが斜めになってしまうようです。

UINavigationBar.appearance().isTranslucent = false

参考URL

stackoverflow.com

2017/10/30追記

TableViewがタブバーと被る問題、UITableViewControllerに下コードを足すことでも解消できました。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    if #available(iOS 11.0, *) {
        tableView.contentInset.bottom = tabBarController?.tabBar.frame.height ?? 0
    }
}

参考URL

iOS11 + Xcode9.0でedgesForExtendedLayoutの値を空にしていると、UITableViewのドリルダウンでアニメーションが崩れる - Qiita