水平方向に反転して、新しいビュー(InfoViewController)を押すボタンを持つMainViewControllerがあります。そのようです:
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
MainView Controllerは、PortraitとPortraitUpsideDownをサポートしています。そのようです:
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return (UIInterfaceOrientationMaskPortrait |
UIInterfaceOrientationMaskPortraitUpsideDown);
}
私のInfoViewControllerには、上記のコードも記載されています。私のAppDelegateでは、LaunchOptionsに次のようになっています。
[self.window setRootViewController:self.mainViewController];
私のapp.plistファイルでは、すべての方向をサポートしています。これは、他のビューもランドスケープをサポートする必要があるためです。したがって、MainViewControllerとInfoViewControllerでは、PortraitとPortraitUpsideDownのみが必要です。しかし、別の見方をすれば、私はすべての指示が必要です。
MainViewControllerは正常に機能しますが、InfoViewControllerはすべての方向で機能します。
これをiOS6で機能させるのに非常に苦労しています。私は他の投稿を調査し、他の人が提供した支援を試しましたが、まったく運がありませんでした。誰かが私がこれを達成するのを手伝ってくれませんか?そして私はObjective-Cの初心者です:p
アプリのplistファイルですべての方向をサポートするのではなく、ルートビューコントローラーがサポートする方向のみをサポートします。
IOS 6では自動回転が変更されています。iOS6では、UIViewControllerのshouldAutorotateToInterfaceOrientation:
メソッドは非推奨になりました。代わりに、supportedInterfaceOrientationsForWindow:
およびshouldAutorotate
メソッドを使用する必要があります。
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
モーダルViewControllersはiOS6で回転呼び出しを取得しなくなりました:willRotateToInterfaceOrientation:duration:,
willAnimateRotationToInterfaceOrientation:duration:,
およびdidRotateFromInterfaceOrientation:
メソッドは、それ自体でフルスクリーンプレゼンテーションを行うViewControllerで呼び出されなくなりました。 presentViewController:animated:completion:
で呼び出されます。
モーダルビューコントローラーを表示するビューコントローラーに回転を通知させることができます。また、presentViewController:animated:completion:
を使用してViewControllerを表示します。 presentModalViewController:animated:
は非推奨であり、コードで使用します。
タブバーコントローラーを使用しながら、同様の問題を解決しました。
サブクラスUITabBarController。これらのメソッドを実装します。
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
- (BOOL)shouldAutorotate
{
NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]);
for (UIViewController *viewController in self.viewControllers) {
[viewController shouldAutorotate];
}
return YES;
}
Tabbarcontroller内のコントローラーで回転を処理する場合は、tab barコントローラー内の各コントローラーでこれらのメソッドも実装し、方向の変更を処理するコードを記述します。それを処理したくない場合は、それらのメソッドを実装する必要はありません。 TabBarControllersメソッドは、向きが変わると常に実行されます。理由は不明ですが2回でも。
はい。すべてのshouldAutorotateメソッドを削除することを忘れないでください。完全に新しいオリエンテーションモデルに移行しました。それらを残したいのなら、おそらくそれは難しいでしょう。
このコードをサブクラスUITabBarController.mに追加します
@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}
@end
@implementation NameClassUITabBar
- (void)viewDidLoad {
[super viewDidLoad];
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
@end
ここに、回転を使用してタブバーコントローラーにソリューション/エクスペリエンスを投稿しました: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html
UINavigationControllerをサブクラス化してカテゴリを作成し、.hファイルに次のメソッドを実装します
-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
in .m file
-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}
ビューコントローラクラスに次のメソッドを実装し、クラスuは回転を有効にします
-(NSUInteger)supportedInterfaceOrientations
{
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}