28

ビデオを再生し、他のタブUITabBarControllerに他の情報を表示するアプリがあります。UITabBariOS 6UIViewでは、回転メソッドは非推奨になりました。今度はshouldAutoRotatesupportedInterfaceOrientationsメソッドを使用する必要があります。ビデオの再生にはを使用しますMPMoviePlayerViewController

このプレーヤービューのみを回転させる方法は?アプリ全体をローテーションすることしかできませんが、これはしたくありません。私は提示MPMoviePlayerViewControllerしますが、iOS5以前のように回転しません。

設定では、plistポートレートインターフェイスの向きを1つだけ設定しました。他を設定すると、アプリ全体が回転します。

4

7 に答える 7

45

AppleのiOS6SDKリリースノートから:

自動回転はiOS6で変更されています。iOS6では、UIViewControllerのshouldAutorotateToInterfaceOrientation:メソッドは非推奨になりました。代わりに、supportedInterfaceOrientationsForWindow:およびshouldAutorotateメソッドを使用する必要があります。

より多くの責任は、アプリとアプリデリゲートに移動することです。現在、iOSコンテナ(UINavigationControllerなど)は、自動回転する必要があるかどうかを判断するために子に相談しません。デフォルトでは、アプリとビューコントローラーでサポートされているインターフェイスの向きは、iPadイディオムの場合はUIInterfaceOrientationMaskAllに、iPhoneイディオムの場合はUIInterfaceOrientationMaskAllButUpsideDownに設定されています。

ビューコントローラでサポートされているインターフェイスの向きは時間の経過とともに変化する可能性があります。アプリでサポートされているインターフェイスの向きでさえ、時間の経過とともに変化する可能性があります。システムは、デバイスが回転するとき、またはビューコントローラがフルスクリーンのモーダルプレゼンテーションスタイルで表示されるときはいつでも、サポートされているインターフェイスの向きを最上位のフルスクリーンビューコントローラ(通常はルートビューコントローラ)に要求します。さらに、サポートされている方向は、このViewControllerがshouldAutorotateメソッドからYESを返した場合にのみ取得されます。システムは、ビューコントローラーでサポートされている方向とアプリでサポートされている方向(Info.plistファイルまたはアプリデリゲートのapplication:supportedInterfaceOrientationsForWindow:メソッドで決定)を交差させて、回転するかどうかを決定します。

システムは、アプリのsupportedInterfaceOrientationsForWindow:メソッドによって返される値を、最上位のフルスクリーンコントローラーのsupportedInterfaceOrientationsメソッドによって返される値と交差させることによって、方向がサポートされているかどうかを判断します。setStatusBarOrientation:animated:メソッドは完全に非推奨ではありません。これは、最上位のフルスクリーンビューコントローラーのsupportedInterfaceOrientationsメソッドが0を返した場合にのみ機能するようになりました。これにより、呼び出し元はステータスバーの方向が一貫していることを確認する責任があります。

互換性のために、shouldAutorotateToInterfaceOrientation:メソッドをまだ実装しているビューコントローラは、新しい自動回転動作を取得しません。(つまり、サポートされている方向を決定するためにアプリ、アプリデリゲート、またはInfo.plistファイルを使用することにフォールバックしません。)代わりに、shouldAutorotateToInterfaceOrientation:メソッドを使用して、supportedInterfaceOrientationsメソッドによって返される情報を合成します。 。

アプリ全体を回転させたい場合は、すべての方向をサポートするようにInfo.plistを設定する必要があります。特定のビューを縦向きのみにしたい場合は、ある種のサブクラスを実行し、自動回転メソッドをオーバーライドして縦向きのみを返す必要があります。ここに例があります:

https://stackoverflow.com/a/12522119/1575017

于 2012-09-21T21:49:12.850 に答える
13

ああ!半日を費やし、問題は解決しました!彼は彼。

上記のドキュメントにあるように、これは本当にそれです!コアポイントは次のとおりです。

より多くの責任は、アプリとアプリデリゲートに移動することです。現在、iOSコンテナ(UINavigationControllerなど)は、自動回転する必要があるかどうかを判断するために子に相談しません。デフォルトでは、アプリとビューコントローラーでサポートされているインターフェイスの向きは、iPadイディオムの場合はUIInterfaceOrientationMaskAllに、iPhoneイディオムの場合はUIInterfaceOrientationMaskAllButUpsideDownに設定されています。

したがって、ルートコントローラーで何かが変更されると、システムはアプリのデリゲートに「では、私たちは何ですか?回転しているかどうか?」と尋ねます。

「回転」の場合:

サポートされている方向は、このViewControllerがshouldAutorotateメソッドからYESを返した場合にのみ取得されます

次に、システムはアプリの代理人に

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    

    return ...;
}

それは本当に簡単です。

ポートレートやランドスケープなどをいつ許可するかを決定する方法はあなた次第です。ルートコントローラーのテストは、いくつかの点で機能しませんでしたが、これは機能します。

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    

    return self.fullScreenVideoIsPlaying ?
        UIInterfaceOrientationMaskAllButUpsideDown :
        UIInterfaceOrientationMaskPortrait;
}

プロパティ「fullScreenVideoIsPlaying」は、必要なときに手動で設定します。

注意すべき他の唯一の重要なことは列挙型です。それがドキュメントで言うように...(iPad / iPhoneのものの上を注意深く読んでください)。だから、あなたは必要に応じてそれらで遊ぶことができます。

もう1つの小さなことは、プレーヤーコントローラーを閉じた後のバグのある動作でした。それが向きを変えなかった時がありました、しかしそれは一度そしてある奇妙な方法で、そしてシミュレーターでのみ起こりました(もちろんiOS6のみ)。そのため、予期せず発生し、アプリの他の要素をすばやくクリックした後、通常の方向に回転したため、反応することさえできませんでした。ですから、よくわかりません-シミュレーターの作業に多少の遅れがあるかもしれません(または、実際にはバグです:))。

幸運を!

于 2012-11-07T23:01:52.710 に答える
7

私は自分のアプリで同じ問題を抱えていました。

iOS6でのローテーションの仕組みはそれです。

=>UINavigationCOntrollerを使用しているときはいつでもAppDelegateのメソッド

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window    
{
   return 
}

回転するかどうかを決定します。

=>ビューがモーダルプレゼンテーションスタイルで表示される場合、メソッド

- (BOOL)shouldAutorotate

そのビューのviewController内にあるものは、appDelegateのメソッドをトリガーします。そして、最初のケースとして、appDelegateは回転するかどうかを決定します。

私の解決策::

モーダルプレゼンテーションのために私がしたことはそれでした。アプリデリゲートにフラグを作成しました。

フラグがYESの場合は常に、横向きに回転し、それ以外の場合は唯一の縦向きに回転します。

- (NSUInteger)application:(UIApplication*)application
supportedInterfaceOrientationsForWindow:(UIWindow*)window
{
    if(self.shouldRotate ) //shouldRotate is my flag
    {
        self.shouldRotate = NO;
        return (UIInterfaceOrientationMaskAll);
    }
    return (UIInterfaceOrientationMaskPortrait);
}

そして、回転を切り替えるには

- (BOOL)shouldAutorotate
{
    YourAppDelegate *mainDelegate = (YourAppDelegate*)[[UIApplication sharedApplication]delegate];
    mainDelegate.shouldRotate = YES;

    return YES;
}

:これは、ModelyPresentedのビューでのみ機能します。フラグを使用することは、良いコーディング方法ではありません。

于 2012-11-29T13:01:08.130 に答える
3

UITabBarControllerをサブクラス化して、次のように、その子にshouldAutorotateとsupportedInterfaceOrientationについて尋ねさせることもできます。

@implementation MyTabBarController

-(BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

@end

次に、標準のコンテナの代わりにカスタムコンテナを使用するだけで、機能します。テストしたばかりです。

于 2013-01-03T15:48:55.837 に答える
2

残念ながら、plistのすべての方向をオンにし、回転させたくないすべてのViewControllerでsupportedInterfaceOrientationsを使用する必要があります。(あなたの場合、ビデオプレーヤー以外のすべて。)

于 2012-09-22T00:56:35.897 に答える
1

これを試して、

TabBarControllerがウィンドウのRootViewControllerである場合、TabBarControllerを継承するカスタムクラスを作成します。たとえば、CustomTabBarController.h

CustomTabBarController.hに以下のメソッドを追加します

-(NSUInteger)supportedInterfaceOrientations // Must return Orientation Mask

最後にAppDelegate.mで以下に電話してください

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  {
   if( [self.window.rootViewController supportedInterfaceOrientations]!=0) 
     {
        return [self.window.rootViewController supportedInterfaceOrientations];
    }
    return UIInterfaceOrientationMaskAll;
}
于 2013-01-28T11:00:02.660 に答える
0

これを設定する最も簡単な方法は、[ターゲット....概要]タブ(iPhone / iPadの展開情報の下)を見ると表示される[サポートされているインターフェイスの向き]ボタンを使用することです。

基本的には、plistファイルを設定するためのGUIです。

于 2012-10-31T13:30:32.453 に答える