これはShouldAutorotateToInterfaceOrientation
iOS6で非推奨になり、特定のビューを縦向きのみに強制するために使用したので、iOS 6でこれを行う正しい方法は何ですか?これは私のアプリの1つの領域のみであり、他のすべてのビューは回転できます。
回答:
すべてのナビゲーションコントローラーがトップビューコントローラーを尊重するようにしたい場合は、カテゴリを使用できるため、クラス名の束を調べて変更する必要はありません。
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
コメントのいくつかが指摘しているように、これは問題の迅速な修正です。より良い解決策は、サブクラスUINavigationControllerであり、これらのメソッドをそこに配置します。サブクラスは、6と7のサポートにも役立ちます。
iOS6のための最善の方法は、特にレイWenderlichチームによって「iOS6ことでチュートリアル」で注目される- http://www.raywenderlich.com/とサブクラス化するよりも優れているUINavigationController
ほとんどの場合。
UINavigationController
初期のViewControllerとしてセットを含むストーリーボードでiOS6を使用しています。
//AppDelegate.m-残念ながら、このメソッドはiOS6より前では使用できません
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
//MyViewController.m-それぞれにサポートしたい方向を返します UIViewController
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
この回答は、OPの投稿のコメントで尋ねられた質問に関連しています。
ビューを特定の方向に強制的に表示するには、viewWillAppearに次のように配置します。
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
}
ちょっとしたハックですが、これUIViewController
により、前のコントローラーが横向きであったとしても、縦向きで表示されるようになります。
iOS7のアップデート
上記の方法は廃止されたため、iOS7では次を使用します。
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[c.view setBackgroundColor:[UIColor redColor]];
[self.navigationController presentViewController:c animated:NO completion:^{
[self.navigationController dismissViewControllerAnimated:YES completion:^{
}];
}];
}
興味深いことに、これを書いている時点では、現在または却下のいずれかをアニメーション化する必要があります。どちらでもない場合は、白い画面が表示されます。なぜこれが機能するのかわかりませんが、機能します!どちらをアニメートするかによって視覚効果が異なります。
そのため、縦向きのみのモーダルビューを表示するときに同じ問題が発生しました。通常は、を作成しUINavigationController
、をviewController
として設定してからrootViewController
、をUINavigationController
モーダルビューとして表示します。しかし、iOS 6では、viewController
サポートされているインターフェイスの向きをnavigationControllerに要求するようになりました(デフォルトでは、すべてiPad用で、iPhoneでは逆さまになっています)。
解決策:UINavigationController
自動回転メソッドをサブクラス化してオーバーライドする必要がありました。一種のラメ。
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 6
-(BOOL)shouldAutorotate{
return YES;
}
-(NSInteger)supportedInterfaceOrientations{
// UIInterfaceOrientationMaskLandscape;
// 24
//
// UIInterfaceOrientationMaskLandscapeLeft;
// 16
//
// UIInterfaceOrientationMaskLandscapeRight;
// 8
//
// UIInterfaceOrientationMaskPortrait;
// 2
// return UIInterfaceOrientationMaskPortrait;
// or
return 2;
}
UIViewControllerの回転メソッドはカテゴリ自体で宣言されているため、@ apratoの回答には同意しません。そのため、別のカテゴリでオーバーライドすると、未定義の動作が発生します。UINavigationController(またはUITabBarController)サブクラスでそれらをオーバーライドする方が安全です
また、これは、ランドスケープビューからポートレートのみのVCに、またはその逆にプッシュ/提示/ポップするシナリオには適用されません。この難しい問題(Appleが対処したことはありません)を解決するには、次のことを行う必要があります。
iOS <= 4およびiOS> = 6の場合:
UIViewController *vc = [[UIViewController alloc]init];
[self presentModalViewController:vc animated:NO];
[self dismissModalViewControllerAnimated:NO];
[vc release];
iOS 5の場合:
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];
これらは本当にUIKitにすべてのshouldAutorotate、supportedInterfaceOrientationsなどを再評価するように強制します。
https://stackoverflow.com/a/13982508/2516436とhttps://stackoverflow.com/a/17578272/2516436を組み合わせた非常に優れたアプローチがあります
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [self topViewControllerWithRootViewController:self.window.rootViewController];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
各UIViewControllerでサポートする方向を返します
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
UISplitViewControllerとUISegmentedControllerを使用する比較的複雑なユニバーサルアプリがあり、Landscapeで表示する必要のあるビューがいくつかあります。 presentViewController
。上で提案した方法を使用して、iPhone ios 5&6を問題なく動作させることができましたが、何らかの理由でiPadは単にLandscapeとして表示することを拒否しました。最後に、デバイスとiOS 5および6の両方で機能する簡単なソリューション(数時間の読み取りと試行錯誤の後に実装)を見つけました。
ステップ1)コントローラーで、必要な方向を指定します(上記のように多かれ少なかれ)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
NSInteger mask = UIInterfaceOrientationMaskLandscape;
return mask;
}
ステップ2)単純なUINavigationControllerサブクラスを作成し、次のメソッドを実装します
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
ステップ3)viewControllerを提示します
vc = [[MyViewController alloc]init];
MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc];
[self myNavigationController animated:YES completion:nil];
これが誰かに役立つことを願っています。
ここで退屈することはありませんが、サブクラスを共有していただけませんか?ありがとうございました。
編集:まあ、私はついにそれをしました、サブクラスはとても簡単にできました。私は宣言していたnavigationController
にしAppDelegate
てUINavigationControllerSubclass
デフォルトの代わりにUINavigationController
、その後であなたのサブクラスを変更:
- (BOOL)shouldAutorotate {
return _shouldRotate;
}
を呼び出すことで、回転するかどうかを設定できます。 viewDidLoad
_navController = (UINavigationController *)self.navigationController;
[_navController setShouldRotate : YES / NO]
この調整が他の人にも役立つことを願っています、あなたのヒントに感謝します!
ヒント:を活用する
- (NSUInteger)supportedInterfaceOrientations
ビューコントローラにあるので、横向きに縦向きの目的のビューを表示したり、その逆を行ったりすることはありません。
Monotouchの場合、次のように行うことができます。
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
return UIInterfaceOrientationMask.LandscapeRight;
}
public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
{
return UIInterfaceOrientation.LandscapeRight;
}
私は多くの答えを見ますが、方向についての特定のアイデアと答えは得られませんが、リンクが方向をよく理解し、ios6の強制的な回転を削除するのを見てください。
http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/
助けがいっぱいだと思います。
project.plistに移動し、サポートされているインターフェイスの向きを追加してから、Portrait(下部のホームボタン)とPortrait(上部のホームボタン)のみを追加します。
プロジェクトの要件に応じて、方向を追加または削除できます。
ありがとう
1)プロジェクト設定とinfo.plistをチェックし、必要な方向のみが選択されていることを確認します。
2)最上位のビューコントローラー(ナビゲーションコントローラー/タブバーコントローラー)に次のメソッドを追加します
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
3)アプリデリゲートに次のメソッドを追加します
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait;
}