22

変更時に回転しMPMoviePlayerViewControllerないという奇妙な動作があります。ただし、新しいプロジェクトで同じビュー階層を再作成したところ、プレーヤーが起動すると、すべての方向に回転しました。方向を明示的に設定している可能性のあるものを探してプロジェクトを精査しましたが、何もありません。autoorientationMPMoviePlayerViewController

関連するすべての情報と、これまでに試したことをまとめます。

現在、ビュー階層は次のようになっています。

  • ナビゲーションコントローラー
  • 「ルート」ビュー コントローラー<- ナビゲーション コントローラーの「rootViewController」
  • "Feed" View Controller <- ルート VC によってナビゲーション スタックにプッシュされる
  • 「プレビュー」View Controller <- フィードからモーダル VC として提示
  • MPMoviePlayerViewController サブクラス<-「presentMoviePlayerViewControllerAnimated」を介してフィード VC によって提示される

ビュー階層内のすべてのクラスは、UIInterfaceOrientationPortrait に対してのみ、shouldAutorotateToInterfaceOrientation に YES で応答します。

私が試したこと:

  • shouldAutorotateToInterfaceOrientationアップ スタックを「ルート」VCからMPMoviePlayerViewController
  • MPMoviePlayerViewControllerサブクラスの実装をオーバーライドしてshouldAutorotateToInterfaceOrientation、横方向の両方で YES を返し、すべての方向でYES を返します。
  • プロジェクトの概要タブで「サポートされているデバイスの向き」を設定します。
  • presentMoviePlayerViewControllerAnimatedフィード VC などの他の VC から を呼び出す

ムービー プレーヤーが同じビュー階層を持つ新しいプロジェクトで適切に回転する場合、何が邪魔になる可能性がありますか。オリエンテーションが行き詰まる可能性がある場所に関するアイデアはありますか?

4

12 に答える 12

7

presentMoviePlayerViewControllerAnimatedサブビューとして追加するのではなく、使用しないことをお勧めします。私はそれがあなたの問題をうまく解決すると思います。

MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
                    initWithContentURL:[NSURL fileURLWithPath:self.filePath]];
[self.view addSubview:mpviewController.view];
[self setWantsFullScreenLayout:YES]; 

検出されたら削除しmpviewController.viewます。MPMoviePlayerPlaybackDidFinishNotificationあなたの成功を見させてください...

于 2012-05-24T05:15:45.483 に答える
3

MPMoviePlayerViewControllerサポートされているインターフェイスの向きについて、オブジェクトがプロジェクトの Info.plist 設定を尊重することがわかりました。私のプロジェクトでは、そのファイルで横向きのビューのみを許可していたのでYESshouldAutorotateToInterfaceOrientation:.

編集: OK、ストローをつかむ:サブクラスautomaticallyForwardAppearanceAndRotationMethodsToChildViewControllersのいずれかで実装していますか? UIViewControllerその場合、それが を返すNO場合、サブクラスは向きの変更時に適切なメソッドを子コントローラーに転送する必要があります。

そうでなければ、あなたのコードを見る方法はありますか?

于 2012-05-22T13:49:39.763 に答える
2

これはばかげた提案かもしれませんが、サブクラスのshouldAutorotateToInterfaceOrientationメソッドが呼び出されていることを確認してください。MPMoviePlayerViewControllerそこに何か問題があったのかもしれません...

また、ここでUIWindow指定されているように、メインに 2 つのサブビューが追加されていないことを確認してください。

Q: UIViewController がデバイスと一緒に回転しないのはなぜですか?

[...]

  • ビュー コントローラーの UIView プロパティは、UIWindow 内に埋め込まれていますが、追加のビュー コントローラーと並んでいます。

それはあなたにもいくつかの問題を引き起こす可能性があると思います。上記のリンクで、何が問題になる可能性があるかについての詳細情報を見つけることができます。

于 2012-05-24T07:35:41.300 に答える
1

解決:

これに遭遇する可能性のある人にとって、ビデオが回転しなかった理由は、誤ってRootViewControllerにUINavigationControllerではなくウィンドウのrootViewControllerを追加していたためです。

self.window.rootViewController = navController; 

正しい

self.window.rootViewController = rootViewController;

ではありません

皆さんの助けと途中での入力に感謝します。

于 2012-06-18T15:49:10.690 に答える
1

いくつかのアイデア:

  • アプリのプロパティUINavigationControllerとして設定されていますか? あなたはそれについて言及しませんでした。ナビゲーション コントローラーのビューをウィンドウに追加するのではなく、これを行う必要があります。rootViewControllerUIWindow
  • 階層全体を一度に構築する場合は、分解してみてください。次のView Controllerを階層に追加するボタンを各ステージに追加できます。
  • ビュー コントローラーの階層構造からアニメーションを削除してみてください。同時に複数のアニメーションを実行すると、問題が発生する可能性があります。たとえば、2 つのビュー コントローラーUINavigationControlleranimated:YES. 同様の問題が発生する可能性があります。
  • ビュー コントローラ階層全体をメイン スレッドで構築するようにしてください。
  • 回転を「担当」する他のView Controllerがないことを確認してください(@MihaiFratuが書いたように-これは回転の問題の非常に一般的な理由であるため、繰り返す必要がありました:-))。
于 2012-05-30T21:06:13.497 に答える
0

あなたはこれを試してみるべきです(私のために働いた):

.hファイルで宣言します。

BOOL landscape;

.mファイル:

-(IBAction)PlayMovie:(NSString *)movieName {
    landscape = YES;
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *moviePath = [bundle pathForResource:movieName ofType:@"mp4"];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
    MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    theMovie.scalingMode = MPMovieScalingModeAspectFill;
    [theMovie play];
    MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayer];
}

-(void)dismissMoviePlayerViewControllerAnimated {
    landscape = NO;
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// You can change the return for your needs.
    if (landscape == YES) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else { return NO; }
}

ここで行ったことは、ムービービューを作成し、「landscape」BOOLをYESに設定することです。

次に、「shouldAutorotateToInterfaceOrientation」がこれを検出し、ビューを自動回転します。

そして、映画が終わったら、「風景」をNOに設定して、ビューが後ろに回転するようにします。

于 2012-05-29T22:09:53.743 に答える
0

ストーリーボードを使用していますか?壊れたプロジェクトとテスト プロジェクトの間で、UIViewControllers と UINavigationController の向きの設定を比較します。属性インスペクタの「方向」設定により、1 つの方向にロックされている可能性があります。

あなたはあなたのplist設定について言及shouldAutorotateToInterfaceOrientation:したので、私はそれについては触れません...

于 2012-05-23T21:54:52.810 に答える
0

あなたの質問にはいくつかの理由があります..

***あなたは呼び出しMPMoviePlayerViewControllerています..だからAutoOrientationを適用し、PushViewControllerで"Feed" View Controller呼び出してみてください..

***MPMoviePlayerControllerの代わりに 使用MPMoviePlayerViewControllerし、サブビューをFeedViewController..に追加します。

MPMoviePlayerController のサンプル コード --

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"type"]];
videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
videoPlayer.controlStyle = MPMovieControlStyleNone; 
videoPlayer.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width);
[videoPlayer prepareToPlay];
videoPlayer.view.center = self.view.center;
videoPlayer.fullscreen = YES;
[self.view addSubview:videoPlayer.view];
[videoPlayer play];

***Xcode のターゲット設定を確認し、すべての向きを有効にして適用します。

于 2012-05-28T06:13:15.850 に答える
0

MPMoviePlayerViewController には多くの苦労がありました。これは、縦向きから横向きに、またはその逆に回転できる唯一のコントローラーである必要があります。ストーリーボード付きのiOS7、iOS8アプリでした。

ここに解決策があります:

  1. アプリケーションは、可能なすべての必要な向きを有効にする必要があります画像の通り
  2. 縦向きモードのみをサポートする必要があるすべての UIViewController は、次のような次のメソッドを実装する必要があります。

    -(BOOL)shouldAutorotate
    {
        return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    
  3. MPMoviePlayerViewController を拡張し、次のメソッドを次のようにオーバーライドする必要があります

    -(BOOL)shouldAutorotate
    {
      return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
      return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    
  4. presentMoviePlayerViewControllerAnimatedMPMoviePlayerViewController を表示するために使用します

于 2015-06-12T14:01:52.460 に答える
0

このメソッドを AppDelegate.m に追加します

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

if(!ISIPAD)

  {

    if ([[self.window.rootViewController presentedViewController]   isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed])

    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}
return UIInterfaceOrientationMaskAllButUpsideDown ;

}

于 2015-07-22T13:52:54.150 に答える
0

同様の問題がありました。

解決方法:

  1. サポートされているインターフェイスの向き ([ターゲット] > [概要]) ですべての向きを有効にする
  2. これで、アプリはすべての方向で回転を開始します。これが必要ない場合は、ステップ 1 をスキップして、appDelegate に次のメソッドを追加するだけです

    • (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ return UIInterfaceOrientationMaskAll; }
  3. どこでも shouldAutorotateToInterfaceOrientation を削除する

  4. アプリに必要なオリエンテーションをサポートするために、View Controller に次のメソッドを追加します

    • (NSUInteger)supportedInterfaceOrientations { UIInterfaceOrientationMaskPortrait を返します。}
  5. ステップ 4 と同じメソッドを MPMoviePlayerViewController のサブクラスに追加して、ビデオ プレーヤーに必要な方向を指定できます。

于 2012-09-27T16:59:01.680 に答える
0

このガイドは、ビデオプレーヤーのみを横向きで表示できるようにするために欠けていたいくつかの手順を確認するのに役立ち、残りのアプリケーションは縦向きモードで修正されたままにしました。

iOS6 と自動回転のヒント

于 2014-07-15T10:11:50.627 に答える