私はこれを解決するためにインターネットを精査してきましたが、何も見つかりません。 iOS 5アプリとiOS 6の互換性を確保しようとしています。オリエンテーションを正しく機能させることができません。回転が発生する時期を検出できません。私が試しているコードは次のとおりです。
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
新しいsupportedInterfaceOrientation:メソッドが正常に呼び出されます。ただし、shouldAutorotateメソッドは起動しません。回転時に画像を交換する必要がありますが、回転が発生することを示す兆候は得られません。
前もって感謝します。
アプリの起動時に次のエラーが表示されるかどうかを確認してください。
アプリケーションウィンドウには、アプリケーションの起動時にルートビューコントローラーが必要です。
その場合、それを修正する方法は、AppDelegate.m
ファイル(これを修正する方法はいくつかありますが)
// Replace
[self.window addSubview:[navigationController view]]; //OLD
// With
[self.window setRootViewController:navigationController]; //NEW
この後、shouldAutoRotate
を正しく呼び出す必要があります。
UINavigationControllerをアプリの基盤として使用する場合、次のサブクラスを使用して、最上位の子ViewControllerが回転を決定できる柔軟性を提供します。
@interface RotationAwareNavigationController : UINavigationController
@end
@implementation RotationAwareNavigationController
-(NSUInteger)supportedInterfaceOrientations {
UIViewController *top = self.topViewController;
return top.supportedInterfaceOrientations;
}
-(BOOL)shouldAutorotate {
UIViewController *top = self.topViewController;
return [top shouldAutorotate];
}
@end
その方法は、それを判断する正しい方法ではありません。正しいメソッドはwillRotateToInterfaceOrientation:duration:
(shouldAutorotateとは対照的に)方向に回転するメソッドは非推奨であり、iOS 6からは呼び出されなくなりましたが、使用方法を意図したものではありませんでした。
[〜#〜] edit [〜#〜]繰り返される下票への応答。私が示した方法を使用することが(OPを引用するために)「回転が発生しようとしていることの表示」ではない理由を説明してください。質問の内容とタイトルが一致していません。
viewController
がviewController
の子UINavigationController
である場合、以下を実行できます。
UINavigationController
shouldAutoRotate
をオーバーライドしますtopViewController
このメッセージを送信します//このメソッドはUINavigationController
サブクラス内にあります
- (BOOL)shouldAutorotate
{
if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
{
return [self.topViewController shouldAutorotate];
}
return NO;
}
IOS 6では、コンテナナビゲーションコントローラーは回転時に子ビューコントローラーを参照しないようです。
in iOS 6リリースノート :
現在、iOSコンテナー(UINavigationControllerなど)は、自動回転する必要があるかどうかを判断するために子を参照しません。デフォルトでは、アプリとView Controllerのサポートされるインターフェイスの向きは、iPadイディオムではUIInterfaceOrientationMaskAllに、iPhoneイディオムではUIInterfaceOrientationMaskAllButUpsideDownに設定されます。
この動作は簡単にテストできます。私がやったのは、同じカスタムView Controllerを使用することです
最初のケースでは、shouldAutorotate
がアプリケーションのサポートされている方向に一致する場合、カスタムナビゲーションコントローラーでsupportedInterfaceOrientations
とsupportedInterfaceOrientations
の組み合わせによってすべてが決定されます。
2番目のケースでは、カスタムView ControllerのsupportedInterfaceOrientations
がUIPageViewControllerによって呼び出された場合でも、戻り値は考慮されません。 UIPageViewControllerのサブクラスで2つのメソッドが上書きされた場合に機能します。このクラスはサブクラス化されるべきではないため、その副作用についてはわかりません。
私はiOS 7を使用していますが、私のケースは他の人に役立つかもしれません。
UITabBarControllerをルートとするディープビューコントローラー階層があります。 shouldAutorotateの呼び出しが保証される唯一の場所は、UITabBarController内です。したがって、UITabBarControllerをサブクラス化し、回転制御ロジックをshouldAutorotateメソッド内に配置するだけです。
また、アプリの起動時に次のエラーが発生しました。
「アプリケーションウィンドウには、アプリケーションの起動時にルートビューコントローラーが必要です」
私はUISplitViewController * splitViewControllerを使用しています
その場合、修正する方法はAppDelegate.mファイルに次の変更を加えることです。
交換
[self.window addSubview:[splitViewController view]];
と
[self.window setRootViewController:splitViewController];
この後、shouldAutoRotate
が呼び出され、正常に機能しました。
これは私がそれをする方法です
現在の向きを確認する場合は、この行をviewconrtoller.mファイルに追加します
#define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown
次に、方向を確認したい場所、次のような条件を書き込みます
- (void)viewDidLoad
{
if(isPortrait)
{
//portrait mode....
NSLog(@"its in IsPotraitMode");
}
else
{
//landscape mode....
NSLog(@"its in IsLandscapeMode");
}
}
UINavigationControllerをアプリの基盤として使用する場合。 UINavigationControllerのカテゴリを作成し、「UINavigationController + autoRotate」と呼びます。これをUINavigationController + autoRotate.hに追加します。
#import <UIKit/UIKit.h>
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;
@end
これをUINavigationController + autoRotate.mに配置します。
#import "UINavigationController+autoRotate.h"
@implementation UINavigationController (autoRotate)
- (BOOL)shouldAutorotate
{
return [self.visibleViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
@end