12

この質問は私の問題の一部にすぎません。既存のアプリケーションに iOS6 の回転と向きのサポートを実装しています。

だから私は ViewController ビューに埋め込まれた MPMoviePlayerController を含む ViewController を持っています (私のアプリケーションはそれを必要とします)。ユーザーはビデオを再生して埋め込みビューで表示するか、デフォルトのプレーヤー コントロールを使用してフル スクリーン ボタンをクリックすると、プレーヤーがフル スクリーン モードになります。

ここで、iOS6 によって提供される新しい回転 API を使用して、View Controller が縦向きのみをサポートするように制限しました。

// New Autorotation support.
- (BOOL)shouldAutorotate;
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

これはかなりうまくいきます。ViewController は縦向きのみをサポートし、ユーザーは埋め込みビューでムービーを再生します。

ユーザーがフルスクリーンモードに入ると、問題が発生します。全画面モードで、シミュレーター/デバイスを回転させると、ムービーが回転し続けます。shouldAutorotateおよびでブレークポイントを使用して全画面表示モードでムービーを再生しているときにデバイスを回転させると、および をそれぞれsupportedInterfaceOrientations返すこれらの両方のメソッドで引き続き映画が回転しています ...NOUIInterfaceOrientationMaskPortrait

なぜこうなった?.... これは私の質問の一部です ... 2 番目の部分は、ユーザーがフルスクリーン モードになったときに、映画を横向きモードにしたいということです。ユーザーがDONEボタンを押すまで、ムービープレーヤーを横向きモードでロックしたい。

助けてください ....

4

8 に答える 8

22

以下の機能を試すことができますAppDelegate

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

}

ここで両方のモードの条件を作成できます。

メディアプレーヤーがフルスクリーンの場合など

return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

それ以外は return UIInterfaceOrientationMaskPortrait;

私は試していませんが、あなたの場合はうまくいくはずです。

ありがとう

于 2012-11-27T09:24:26.640 に答える
1

これはしばらくの間私を消費し、非常に多くの恐ろしいエラーが発生しましたが、最終的にはMPMoviePlayerController ではなくMPMoviePlayerViewControllerを使用することになりました。表示する前に、プロパティであるself.playerViewを回転させました。また、ビデオの終了後にメイン コントロールとメイン ViewController に戻るNSNotificationを追加しました。これを実行する方法は次のとおりです。

        [[NSNotificationCenter defaultCenter] removeObserver:self.playerView
                                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                                      object:self.playerView.moviePlayer];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(movieFinishedCallback:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:self.playerView.moviePlayer];

        self.playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:docUrl];
        self.playerView.view.frame = CGRectMake(10, 10, self.frame.size.width-20, 180);
        [self.playerView.moviePlayer prepareToPlay];

        if(IS_IPHONE_6P)
        {
            [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
            [self.playerView.view setCenter:CGPointMake(212, 368)];
        }
        else if(IS_IPHONE_6)
        {
            [self.playerView.view setBounds:CGRectMake(0, 0, 375, 667)];
            [self.playerView.view setCenter:CGPointMake(187, 333)];
        }
        else if (IS_IPHONE_5)
        {
            [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
            [self.playerView.view setCenter:CGPointMake(160, 284)];
        }
        else
        {
            [self.playerView.view setBounds:CGRectMake(0, 0, 480, 320)];
            [self.playerView.view setCenter:CGPointMake(160, 240)];
        }

        [self.playerView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
        self.playerView.modalPresentationStyle = UIModalPresentationFormSheet;
        self.playerView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

        [self presentViewController:self.playerView animated:YES completion:nil];

また、コールバックmovieFinishedCallback : は次のとおりです。

- (void)movieFinishedCallback:(NSNotification*)aNotification
{
    // Obtain the reason why the movie playback finished
    NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

    // Dismiss the view controller ONLY when the reason is not "playback ended"
    if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
    {
        MPMoviePlayerController *moviePlayer = [aNotification object];
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                                      object:moviePlayer];

        NSLog(@"Video Closed");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
        {
            [self dismissViewControllerAnimated:NO completion:nil];
            self.playerView = nil;

        });
    }
}

これは私にとってはうまくいきました。それが役に立てば幸い。

于 2015-04-06T11:53:20.797 に答える
1

代わりにa を使用することをお勧めしますMPMoviePlayerViewController。それをサブクラス化し、supportedInterfaceOrientationsメソッドを実装して を返しUIInterfaceOrientationMaskLandscapeます。

メソッドを実装する必要がある場合もありますshouldAutorotateToInterfaceOrientation:

クラス リファレンスを参照してください: MPMoviePlayerViewController

編集:この投稿もご覧ください: iphone - MPMoviePlayerController にランドスケープ モードでビデオを強制的に再生させる

于 2012-11-27T09:32:26.010 に答える
0

これを使って

moviePlayerController.view.transform = CGAffineTransformMakeRotation(M_PI/2);

それはios 7で動作します

于 2014-01-27T11:28:08.683 に答える
0

このコードをView Controllerに追加するだけです

-(NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}
于 2014-04-21T09:14:51.803 に答える
0

プロジェクトで名前のプロジェクトを選択し、右側のウィンドウで情報タブを選択します。カスタム ios ターゲット プロパティで、キーを追加してキーを選択します: 「初期インターフェイスの向き」設定値: 縦 (下のホーム ボタン)

  • プロジェクトを再構築します-> OK
于 2012-11-27T09:36:11.787 に答える