【Objective-C】ViewControllerの画面向きを管理する「shouldAutorotate」「- (UIInterfaceOrientationMask)supportedInterfaceOrientations」が呼び出されない時に確認するべきこと【Xcode11/iOS13】

こういう人に向けて発信しています。
・画面向きを設定しているにも関わらず、表題メソッドを通過しない人
・呼び出されなくて困っている人
・Objective-C初心者

そもそも表題のメソッドは何か。

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

/**
@brief 回転させるかどうかの設定(NOの場合、回転を許可しない)
*/
- (BOOL)shouldAutorotate {
   return YES;
}

/**
@brief 許可する向きの設定
*/
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
   //例:横向きのみを許可する
   return UIInterfaceOrientationMaskLandscape;
}

@end

上記コードのように
(1)そもそも回転を許可するのか
(2)もし回転する場合はどの向きならばOKなのか

という内容を決める処理になっております。

ただ、特定の条件で呼び出されないので差分が分からず困っている方など
いらっしゃると思います。

例えば新規でプロジェクトを作成し、上記コードをコピペすると
呼び出されないと思います。

原因

スクリーンショット 2019-11-28 20.03.40

スクリーンショット 2019-11-28 20.07.54

上記info.plistにて「Supported Interface orientations (iPad)」
4方向の画面向きが追加されていると上記メソッドが呼び出されません。

「Supported Interface orientations (iPad)」とは?

iPad版でのアプリ全体で許可する向きを記載する箇所です。
「え、でも一部のViewControllerだけでは横向きだけを固定したい」という
ニーズももちろんあると思います。

しかし、問題ありません。
上記から「Portrait (top home button)」を削除。

すると冒頭コードのような画面向きを制約付けていないViewControllerは、
ボタンを上向きにする向きにはならなくなったと思います。

個別の画面で向きを設定したい時は個別のクラスで冒頭コードを記載ください。そして許可する画面を指定してください。

優先度は個別クラス(ViewController)の設定>アプリ全体適用です。

なぜ呼び出されなくなるのか?(仮説)

調査した結果の仮説ですが、おそらくアプリ全体で全方向を許可していると「回転しても良い処理か」「回転の向き」を設定しなくてもいいという、
判定に入られているのかなと思います。

ゆえに判定式を一切通らなくなると。

なので4方向は追加せずにアプリ全体で許可する向きを「4件ではない状態」に変更しております。

最後に

本件の具体的な原因などご存知のすごい方がいらっしゃれば
お手柔らかにご教示いただけますか。

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