自動回転はビューのUIViewController(shouldAutorotateToInterfaceOrientation:
)によって処理されるため、1つのアプローチは、回転可能なビューが1つのView Controllerによって管理され、回転不可能なビューが別のViewControllerによって管理されるように階層を配置することです。次に、これらのUIViewControllerのルートビューの両方をウィンドウ/スーパービューに追加する必要があります。
ここでの微妙な点は、同じレベルに2つのView Controllerのビューがある場合(つまり、を介して追加された場合addSubview:
)、最初のView Controller(通常はウィンドウのrootViewController
)のみがメッセージを受信することshouldAutorotateToInterfaceOrientation:
です。
私はこのアプローチを自分で使用して、メインビューが回転しないのに回転するツールバーを実現しました。
Appleの技術的なQ&A QA1688(「UIViewControllerがデバイスと一緒に回転しないのはなぜですか?」)は、この問題について少し話します。
iOS 6のアップデート:
自動回転は、とメソッドを使用UIViewController
するようになりました。デフォルトで戻りますが、ビューがウィンドウの直接サブビューである以外のビューコントローラは、とにかく回転コールバックを受信しないことに注意してください。shouldAutorotate
supportedInterfaceOrientations
shouldAutorotate
YES
rootViewController
iOS 6のサンプルコード:
「シングルビューアプリケーション」テンプレートを使用して新しいプロジェクトを作成し、「ストーリーボードを使用する」がチェックされていることを確認します。提供されViewController
たクラスを回転ビューコントローラーとして使用し(必要に応じて名前を変更します)、とUIViewController
呼ばれる2番目のサブクラスを作成しますNonRotatingViewController
。このViewControllerはローテーションコールバックを受信することもありませんが、完全性と明確さのために、次のコードを次のように追加しますNonRotatingViewController.m
。
- (BOOL)shouldAutorotate
{
return NO;
}
MainStoryboard
ファイルで、新しいView Controllerオブジェクトをドラッグして、そのクラスをにNonRotatingViewController
設定し、ストーリーボードIDを「NonRotatingVC」に設定します。そこにいる間に、回転ビューコントローラビューの背景色をクリアに変更し(非回転ビューがこのビューの下に追加されます)、各ビューにラベルを追加します。にAppDelegate.m
、次のコードを追加します。
#import "NonRotatingViewController.h"
// ...
// ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NonRotatingViewController *nonRotatingVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"NonRotatingVC"];
[self.window addSubview:nonRotatingVC.view];
return YES;
}
これは、回転しないビューコントローラをインスタンス化し、そのビューをウィンドウに直接追加するだけです(この時点で、ウィンドウrootViewController
はストーリーボードによってすでに設定されています)。
プロジェクトを実行します。デバイスを回転させ、一方のラベルが回転し、もう一方のラベルが静止しているのを見て驚嘆してください。
iOS 6より前のサンプルコード:
私はこれを新しいプロジェクトで行いました-新しいビューベースのアプリケーションは問題なく動作します。2つの新しいViewControllerを追加します:RotatingViewController
とNonRotatingViewController
。それぞれのペン先の内側に、ビューを回転させるかどうかを説明するラベルを追加しました。次のコードを追加します。
' RotatingViewController.m
'
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
' NonRotatingViewController.m
'
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) { // Or whatever orientation it will be presented in.
return YES;
}
return NO;
}
' AppDelegate.m
'
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RotatingViewController *rotating = [[RotatingViewController alloc] initWithNibName:@"RotatingViewController" bundle:nil];
self.rotatingViewController = rotating;
[rotating release];
NonRotatingViewController *nonRotating = [[NonRotatingViewController alloc] initWithNibName:@"NonRotatingViewController" bundle:nil];
self.nonRotatingViewController = nonRotating;
[nonRotating release];
[self.window addSubview:self.rotatingViewController.view];
[self.window insertSubview:self.nonRotatingViewController.view belowSubview:self.rotatingViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
これがお役に立てば幸いです。