見出し画像

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メソッドを使いましょう、ってことみたいです。



この記事が気に入ったらサポートをしてみませんか?