objective-CのアプリでiOS15対応の際にハマった件
最近、仕事でiOSアプリの保守をやってます。
アプリはObj-Cでコーディングされているため、Obj-CでiOS15の対応をした際にハマった部分を記します。
iOS15以上のシュミレーターで画面クラッシュ
ハマった部分は、tableViewを使用した画面を描画後、クラッシュして画面が操作できなくなる、というものでした。
原因箇所
まずは原因部分を探ります。
ライフサイクル(viewDidloadなど)イベントすべてにブレークポイントをつけて、デバッグを行います。
すると、viewWillLayoutSubviewが無限ループで呼び出されていました。
原因
viewWillLayoutSubviewにはiOS11以上において、safeAreaInsetsで描画領域を取得する記述がありました。
これはiOS11以上においてSafe Area、つまりステータスバー等を除いた画面の描画領域を取得し、画面が上にずれることを、防ぐための記述でした。
しかし、iOS15以上ではどうやらsafeAreaInsetsでの描画領域の値がうまく取得できないようで、その結果、レイアウトの開始位置が決まらないためviewWillLayoutSubviewが無限ループで呼び出されることによりクラッシュしていました。
対応
対応としてはviewWillLayoutSubviewに以下の記述をすることで、iOS15以上のクラッシュを解決しました。
//iOS15以上の場合
if(@available(iOS(15.0,*)){
self.tableView.sectionHeaderTopPadding=0;
//iOS11~14の場合
}else if(@available(iOS(11.0,*)){
CGFloat top=self.view.safeareainsets.top;
//以下略
}
iOS15以上において、UItableViewを使用している画面でのSafe Area対応はUItableViewのsectionHeaderTopPaddingメソッドを使いましょう、ってことみたいです。
この記事が気に入ったらサポートをしてみませんか?