これを注意深く読んでください。そうしないと、訪問者の携帯電話をつかんだ動物園のチンパンジーのように、テスト デバイスを回転させたり、戦ったり、戦ったりして、人生の 1 ~ 2 日を失う可能性があります。遅かれ早かれ...約束:)
iOS 6 で
shouldAutorotateToInterfaceOrientation:
廃止され、置き換えられました
shouldAutorotate
これは、iOS 6 が決して呼び出さないことを意味しますshouldAutorotateToInterfaceOrientation
。
したがって、アプリケーションで次を使用した場合
iOS6以前(iOS5、iOS4など)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) {
// your code for portrait mode
}
return YES;
}
あなたが使用する必要があります
iOS 6以降以降
- (BOOL)shouldAutorotate {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait) {
// your code for portrait mode
}
return YES;
}
注意してください
UIInterfaceOrientation
のプロパティでUIApplication
あり、ステータス バーの向きに対応する 4 つの可能性のみが含まれます。
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
混同しないでください
UIDeviceOrientation
これはUIDevice
クラスのプロパティであり、7 つの可能な値が含まれています。
UIDeviceOrientationUnknown - Can not be determined
UIDeviceOrientationPortrait - Home button facing down
UIDeviceOrientationPortraitUpsideDown - Home button facing up
UIDeviceOrientationLandscapeLeft - Home button facing right
UIDeviceOrientationLandscapeRight - Home button facing left
UIDeviceOrientationFaceUp - Device is flat, with screen facing up
UIDeviceOrientationFaceDown - Device is flat, with screen facing down
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
理論的にはwhich を使用することもできます-デバイスの実際の向き-ただし、常に等しいとは限らないUIDeviceOrientation
ことを知っておく必要があります!!! たとえば、デバイスが無地のテーブルにある場合、予期しない値を受け取る可能性があります。UIDeviceOrientation
UIInterfaceOrientation
インターフェイスの現在の向きUIInterfaceOrientation orientation = self.interfaceOrientation;
を返すも使用できますが、これは のプロパティであるため、クラスでのみアクセスできます。UIInterfaceOrientation
UIViewController
UIViewController
以前の iOS6 (iOS3/4/5) と iOS6 の両方のデバイスをサポートしたい場合 (明らかな可能性があります)、コードで と の両方shouldAutorotateToInterfaceOrientation:
を使用shouldAutorotate
してください。
iOS 6 からは、アプリの起動時にデバイスがチェックする 3 つのレベルと 3 つのステップがあり、必要に応じて制御する必要があります。
1. Info.plist - Supported Interface Orientations
[概要] タブでグラフィカルに設定できます。許可された方向の順序は重要です。これは、 を編集して手動で変更できinfo.plist
ます。デバイスは、アプリの起動時に最初の方向を選択します。[UIDevice currentDevice].orientation
特に平らな面でアプリをテストする場合、不明な可能性がある場合は常にアプリの起動に問題があるため、これは重要です。
注意してください ( iPad
) または (iPhone) 拡張機能には他に 2 つの設定の可能性があります。それらのいずれかを使用すると、現在のデバイスまたはシミュレーターのその設定が使用され、拡張機能なしの一般的な設定は無視されます。そのため、iPhone のみのアプリを実行していて、誤ってデータがなくても plist のどこかに「Supported Interface Orientations (iPad)」行を残してしまった場合、一般設定で以前に確立したルールが無視されます (私の iPhone の例では)。 )、「アプリが iPad で実行するための要件を満たしていないことがわかりました...」というテキストでアプリが拒否される可能性があります。予期しないエラーを引き起こす可能性のあるそれを使用します。
2. AppDelegate - application:supportedInterfaceOrientationsForWindow
許可するすべての方向のビット マスク リストを返します。これは、info.plist 設定をオーバーライドします。これは、デバイスが回転するたびに少なくとも 1 回呼び出されます。
3. Top-level view controller or RootViewController - supportedInterfaceOrientations
これは、クラッシュを回避するためにゼロ以外の結果を持たなければならないアプリとアプリデリゲートのセットとの共通部分を提供します。これは、コントローラーに別のメソッドがインストールされている場合を除いて、デバイスが回転するたびに少なくとも 1 回呼び出されます。
shouldAutorotate
これは、アプリの許可された向きに干渉し、BOOL
with defaultを提供しますYES
。
BE CAREFUL when you use `NavigationController`
次のように、 の最上位のコントローラーとしてAppDelegate
:
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
UINavigationController *navigationController=[[UINavigationController alloc] initWithRootViewController:detailViewController];
self.window.rootViewController =nil;
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
この場合、次のコードAppDelegate
をクラスへのカテゴリ アタッチメントとして配置する必要があります。NavigationController
これは最上位のコントローラであり、そのサブカテゴリを作成していない場合は、方向を設定できる場所/コードがありません。設定なのでrootViewController
、この場合detailViewController
は向きを実際に確認するように強制する必要があります。
@implementation UINavigationController (OrientationSettings_IOS6)
-(BOOL)shouldAutorotate {
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
この後、以下のように、iOS 6 で利用可能な方法のいずれかを使用して、「最上位」ViewController
(私の例ではこれは) で優先方向を設定できます。detailViewController
ViewControllers
1. (BOOL)shouldAutorotate
2. (NSUInteger)supportedInterfaceOrientations
3. (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation