2013-10-21 10 views
9

私は多くの答えを読んだことがありますが、iOS7でオートローテーションを行うことはできません。iOS7の1つのビューコントローラのオートローテーションの処理

私は、回転するために1つのビューコントローラしか必要ないので、私はInfo.plistに回転の設定をしたくありません。

私はアップルのドキュメントを理解しているので、1つのView Controllerで2つのメソッドをオーバーライドするだけで、グローバルローテーション設定(Info.plist)を上書きできます。 Info.plistのは、唯一の肖像画を許可するように設定されている、と私のビューコントローラには、次のメソッドを実装します。

- (NSUInteger)supportedInterfaceOrientations 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

- (BOOL)shouldAutorotate 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    return true; 
} 

は私が回転すると、それらのNSLog文を見ているが、何も回転しません。

適切な回転設定でInfo.plistを設定すると、私のビューは回転しますが、私はView Controllerに依存していません。

重要であるかどうかわかりませんが、回転しようとしているビューは、自動レイアウトを使用している.xibからのものです。

また、私のViewControllerはモーダルに表示されており、ナビゲーションコントローラに含まれています。私はそれだけでビューコントローラを提示しようとしたが、それは動作しません。また、adding a category to UINavigationControllerを試して、topViewControllerからオートローテーション指示を取得しました。

+0

同じ問題があります。さらに、私のアプリはiOS5と互換性があるので、supportedInterfaceOrientationsを使用することはできません。私は他の2つの関数、shouldAutorotate(NOを返す)とshouldAutorotateToInterfaceOrientation(deprecated)を使用しています。彼らも呼ばれていない!それは出る方法がないようです! –

+0

私は最終的にあきらめました...私のxibを見直して、やや妥当なやり方で見えるように見直しました...--( –

答えて

7

あなたはナビゲーションコントローラおよびTabBarのコントローラに(合うようのUIViewControllerクラスの記述からそれらを制限し、その後、すべての可能な値にplistの値を設定する必要があります。

のiOS 6以降では、あなたのアプリはあなたのアプリのInfo.plistファイルに定義されているインターフェイス方向 をサポートしています。ビューコントローラは、 supportedInterfaceOrientationsメソッドをオーバーライドして サポートされている向きのリストを制限することができます。ウィンドウまたはビューコントローラ 全体を塗りつぶす画面;子ビューコントローラは、親ビューである コントローラによって提供されたウィンドウの一部分である を使用し、何回転でサポートされているかについての決定には直接参加しません。アプリの向き マスクとビューコントローラの向きマスクの交差点を使用して、 のビューコントローラをどの方向に回転させるかを決定します。

+0

あなたはあなたがしたいものの前にビューコントローラにshouldautorotateとsupportedinterfaceorientationsを入れます1つの特定の方法または何回転? – jgvb

17

私の場合は、すでに作成された約30のビューコントローラを持つ新しいiOS7アプリがありました。私はただ一つのモーダルビューコントローラで自動回転が必要でした。既存のView Controllerを更新する必要はありませんでした。単一モーダルビューコントローラのIに続いて

@implementation UIViewController (rotate) 
    -(BOOL)shouldAutorotate { 
     return NO; 
    } 
@end 

:私はのUIViewControllerに私のアプリデリゲートにカテゴリを追加

その後

select orientations

は、私はplistの中で望んでいた方向を選択しました回転させたいこのメソッドを追加しました:

-(BOOL)shouldAutorotate { 
     return YES; 
} 

私は、ビューコントローラがモーダルVCでない場合は、代わりにUINavigationControllerにカテゴリメソッドを追加する必要があることを発見しました。ビューコントローラのナビゲーションスタックの一部として、ルートビューコントローラに後続するすべてのVCこれまで:https://stackoverflow.com/a/20283331/396429

+5

カテゴリを使用してメソッドをオーバーライドしないでください。まったく同じことを行うきれいな方法は、すべてのUIViewControllerの基本クラスを作成し、そのメソッドをオーバーライドすることです。 – Stoto

+0

私の答えの全体的なポイントは、UIViewControllerをサブクラス化せずに目的がどのように達成可能であるかを示すことです。場合によってはそうすることが現実的ではありません。 –

+3

@ネイト、あなたの答えの全体が間違っています。あなたのケースが特定のものなので、カテゴリーはこれに使用できません。カテゴリを使用してメソッドをオーバーライドすると、実際にそれをオーバーライドする保証はなく、以前のものを選択できます。 – igrek

1

私はこのような問題に直面しました。私のアプリには1つのランドスケープビューしかありませんでした。 私はこれを処理するために以下のコードを使用しました。

#import "objc/message.h" 
-(void)viewWillAppear:(BOOL)animated{ 

objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft); 
} 
+1

ハックとスラッシュ – Burf2000

16

シンプルですが、非常にうまく動作します。 IOS 7.1と8

AppDelegate.h

@property() BOOL restrictRotation; 

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
if(self.restrictRotation) 
    return UIInterfaceOrientationMaskPortrait; 
else 
    return UIInterfaceOrientationMaskAll; 
} 

のViewController

-(void) restrictRotation:(BOOL) restriction 
{ 
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; 
    appDelegate.restrictRotation = restriction; 
} 

のviewDidLoad

[self restrictRotation:YES]; or NO 
+0

それは私がそこに見つける巧妙な解決策です。 同じスタック内に1つのView Controllerが制限されていない場合、View Controllerの残りの部分には[self restrictRotation:YES]が必要です。 viewWillAppear(あなたがボタンを押したときのために) ありがとうアラン!あなたは最高です。 –

0

私はこれが古かったと知っていますが、50以上のViewControllerを持つユニークな状況になってしまいました。すべてのアプリケーションで、同じオリエンテーションを1つまたは2つだけ変更してサポートすることを拒否しました。私の答えに私。私はオーバーライドするUIViewControllerカテゴリを作成しました - (BOOL)shouldAutorotateは常にデバイスタイプなどに応じてNOまたはYESを返します(サポートされているインターフェイスの向きでも可能です)。その後ViewControllerで、私はもっと肖像画だけをサポートしたいと思いました。私はshouldAutorotateをうんざりさせてYESを返しました。そして、ビューが使用して親ViewControllers viewWillAppear法に却下されたときの向きの変更を余儀なく:すべてが言わおよび行われた場合には

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].

を、私が使用してコードの< 30行と数ViewControllersに私が欲しかったすべてを達成しましたスウィズルのマクロ。私がshouldAutorotateとsupportedInterfaceOrientationsをアプリケーション内のすべてのVCに置き換えることでやっていたら、私は250行余分なコード行を持っていました。そしてそれを最初に追加する多くの不平を言う仕事。

関連する問題