回転時のレイアウト崩れ修正でやったことiPhoneiPadiOSクリスマスよりも、Appleの審査休みと年内の最終リリース日の方が気になる季節になってきました。2019は8日目、@sussan0416が投稿します、よろしくお願いします。1ヶ月ほど前、縦固定のiPadアプリの改修を担当しました。今日はその時に経験した話です。当然な内容かと思いますが、経験の棚卸しさせてくださいなお、今回の記事はUIViewController寄りの内容ですが、UIView寄りの内容は別記事に書いていますので、そちらも参照いただけますと嬉しいです。Multitaskingと横画面対応はじめに、マルチタスクについておさらいしておきます。iPad向けアプリは、2020年4月までに、マルチタスクへの対応が求められています。Down)で実行できるように改修する必要があります。マルチタスクに対応するためには、必然的に、端末を回転したときのレイアウトにも対応することになります。私が対応した案件では、横レイアウトに対応させることが目的だったので「横画面対応」と呼ばれていました。そのため、ここからは「横画面対応」と呼ばせていただきます。担当した案件についてプロジェクトの状況は以下のとおりでした。「ライフサイクルをちゃんと理解しよう!」これが一番大切でした。当然ではあるのですが、UIViewControllerとUIViewのライフサイクルを理解し「いつレイアウトされるのか」を理解して実装する必要があると、改めて感じました。以下の記事はとても参考になりました!https://qiita.com/motokiee/items/0ca628b4cc74c8c5599dhttps://qiita.com/shtnkgm/items/f133f73baaa71172efb2https://qiita.com/kazuhiro4949/items/2d2f6f1636f0baed2341ここから先は、棚卸しです。非常に長くなったので、UIViewControllerで対応したことのみを棚卸しします......。問題のあるUIViewController私が対応した案件では、こんな実装をよく見かけました。UIの初期化メソッドを、viewDidLoadから呼び出す実装です。インスタンス生成から、レイアウトまでを一気にviewDidLoadでやっているようです。view.addSubview(blueView)}問題点レイアウト処理もviewDidLoadで一気に処理しているため、端末を回転したときにレイアウトが崩れます。1Portraitで起動し、Landscapeへ回転。横幅が足りません......。2Landscapeで起動し、Portraitへ回転。画面からはみ出してしまいました......。3マルチタスクを実行すると......。レイアウトが固定なので、表示の一部は切れてしまいます。これではマルチタスクもできません。実装を修正する必要があります。UIViewのインスタンス化とレイアウトの実装を分ける横幅いっぱいのViewであれば、autoresizingMaskを.flexibleWidthに設定するだけで、ひとまず対応は可能です。autoresizingMaskでは難しい場合もあります。基本的にUIViewのインスタンス化とレイアウト処理は、分けるようにします。viewDidLoadではインスタンス化とviewの追加のみを実行し、レイアウト処理はviewDidLayoutSubviewsに書きます。UIScreen.main.boundsへの依存を直すマルチタスクに対応するとき、ディスプレイサイズに依存した実装はレイアウト崩れの原因になります。ディスプレイサイズは極力使わないようにしたほうが良いです。safeareaInsetを使うviewのy方向のレイアウトが固定値になっていることがありました。X以降のノッチ付き端末だと表示が切れる可能性があります。iPad向けのアプリとはいえ、なるべく、システムが提供するレイアウトのための定数を使うように心がけたいです。画面を回転して戻ってきたときに、CollectionViewのCellが崩れるUICollectionViewや、UITableViewの画面から他の画面へ行き、回転してから戻る。すると、レイアウトが崩れているんですね......。カスタムしているCellの実装が、UIViewのライフサイクルに即して実装してあればよいのですが、Viewの生成とレイアウトが引き剥がしにくくされているなど、難があることが多いです。仕方がなくviewWillTransitionToSize(:withTransitionCoordinator:)を使用して、画面サイズの変更を検知します。collectionView.collectionViewLayout.invalidateLayout()を呼び出しました。collectionView.collectionViewLayout.invalidateLayout()}UICollectionViewの回転時のレイアウト崩れ対応については、別の記事にもまとめましたので、参考にしていただけますと嬉しいです。https://qiita.com/sussan0416/items/e1f76ef6bc340e3e2524まとめiPadアプリを横画面に対応したときの経験をまとめました。UIViewControllerのみを書きましたが、他にも多くの経験がありました。UIView周りの経験を、またどこかでまとめようかな......。UIViewにしてもUIViewControllerにしても、「ライフサイクル意識して実装しよう」これに尽きます......。書ききれないので、今回はこのあたりで。孝宏@sussan0416フリーランスのエンジニア。iOSとAndroidのアプリ開発を専門としています。家では子どもが寝た後の2時間くらいだけ、開発作業しています。開発・運営している会社です。upLoginユーザーは見つかりませんでした。