【最新OS対応】iOS14でSetStatusBarOrientationが動作しなくなった!どうしよー
- ことの経緯
- 原因
- 目標
- 解決
■ことの経緯
仕事でおよそ十年前にリリースされたアプリの最新OS対応を任された(iOS14.5対応)。最新のアップデートはiOS8-iOS11なので、かなり経っている。。。
Xcode12でビルドしたら、なぜか端末の向きが固定されることになった(画面の回転ができるのに)。
これについて調査を行い、Xcode10でビルドしたものは問題なく動作する(iOS12)なので、新しめのOSでのみ発生することが分かった(非推奨の匂いがプンプンしてきた)。
仕様上アプリ内で動的にボタンを押して画面の回転(CGAffineTransform)を制御し、同時にステータスバーの回転処理を行っている(SetStatusBarOrientation)。画面を回転してもステータスバーがついてきてないので、 SetStatusBarOrientationの辺で問題発生しているのでは?っと思いながら、引き続き調査を行った。
それで、原因は分かった。
■原因
SetStatusBarOrientationがiOS9から非推奨になり、iOS14で作動しないことを確認した。iOS13は確認してないが、先輩方によるとiOS13では既に挙動がおかしいらしい。AppleはAutoRotateを対応してほしいみたいなので、なくなって当然か。。。
これにより、AutoRotateを対応せず、動的に端末の回転を制御しているアプリ(CGAffineTransform+SetStatusBarOrietation)では、画面の回転はできるものの、ホームインジケーター、ステータスバー、プッシュ通知などが全部固定のままになってしまう。
■目標
画面の回転をしたときにステータスバー、ホームインジケーターなどがついてきて来るようにしたい!
iOS14にて動的にステータスバー等を制御する方法は未だに見つかっておらず(私の知識不足かも)、ディレクターと先方と相談した結果、AutoRotateを対応することになった。
※ご存じの方がいたら、ぜひご教授を
■解決
ならば話が早い!
・ShouldAutoRotateの対応
・レイアウトの修正
・元の機能の削除
実際の対応はこれぐらいになる。
SetStatusBarOrientationが使えなくなったので、先ずは端末の回転ができるようにしたいと思い、ShouldAutoRotateの対応をした。特に制限を加えることがなく、やり方も簡単で、ソースは以下になる。
/**ここからはソース**/
- (Bool)ShouldAutoRotate{
if(/*制限を加えたい場合*/) return NO;
return YES;
}
/**ここまではソース**/
これを追加した後に自動回転を設定する箇所に回転を許可したい向きを設定すればよい。私の場合はLandscapeLeft、LandscapeRight、Protraitを許可した。
正直ProtraitUpsideDownの存在が微妙。。。端末を逆さまに持つシチュエーションってあまりなくない?っと思いながらも、
作りとして4方向対応が必須なので(Appleより)、ちゃんとできるようにしましょう!
早速確認したところ、ホームインジケーターやプッシュ通知などは固定のままではなく、ちゃんとついてきた!
が、画面がそのまま引き延ばされて、製品として提供できない。。。
という問題点があって、レイアウトの調整が必要になった。以下ソース。
/**ここからはソース**/
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>) coordinator{
coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>context){
//ここでレイアウトの処理
} completion:nil]; }
/**ここまではソース**/
Viewのサイズを指定する必要があるので、Coordinatorを指定した。
これでレイアウトが調整された。
最後は、元の仕様にあたる部分は今回の対応でいくつか競合する箇所があり、そこのソースの削除やいくつかのレイアウトの修正を行った。
例えばSetStatusBarOrientationは作動しなくなったとはいえ、放置したままはよくないので、コメントアウトを。
これで対応がひとまず完了。
■課題
対応は完了したが、気になる課題がいくつか残っている(実際に執筆した時点でも問題が発生している)。
例えば、元の仕様では動的に端末の回転を行っているので、想定していないシチュエーションで回転を許可するとどうなるか。ViewWillTransitionToSizeの実行タイミングは完全にシステム任せなので、アプリ側からの制御が難しい、描画中やシーン遷移中に実行されるとおかしくなりそう。。。
一応作りによるものなので、SetStatusBarOrientationの対応はこれで良いと思う。
これらの課題に関しては、別途で記事を作る予定。