web-dev-qa-db-ja.com

フルスクリーンMPMoviePlayerControllerで横向きを強制すると、フルスクリーンを終了するときに正しい回転が妨げられます

すべてのインターフェイスの向きをサポートするiPhoneアプリケーション(iOS6 +)があります。ただし、MPMoviePlayerControllerがビデオをフルスクリーンで再生している場合は、横向きのみをサポートする必要があります。

Stack Overflowで次の解決策を見つけましたが、機能します。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];

.。

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (self.landscapeOnlyOrientation) {
        return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
    }
    return UIInterfaceOrientationMaskAll;
}

- (void)moviePlayerWillEnterFullscreenNotification:(NSNotification*)notification {
    self.landscapeOnlyOrientation = YES;
}

- (void)moviePlayerWillExitFullscreenNotification:(NSNotification*)notification {
    self.landscapeOnlyOrientation = NO;
}

ただし、厄介な問題が解決しません。つまり、ビデオが縦向きでフルスクリーンを終了した場合(強制的な横向きで再生した後)、下にあるビューが回転して戻りません。向きの更新をトリガーするには、デバイスを手動で横向きに回転させ、縦向きに戻す必要があります。この種の更新をプログラムでトリガーする方法はありますか?

次の一連のスクリーンショットは、私が何を意味するかを示しているはずです。

enter image description hereenter image description hereenter image description here

注意:さまざまな理由により、MPMoviePlayerViewControllerを使用することはできません。

14
svth

こんにちはすべて私はそれを解決した同じ問題を抱えていました-

これが私の完全なコードです...

最初にappdelegateを変更する必要があります。

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([[[NowPlaying sharedManager] playerViewController] allowRotation])//Place your condition here
{
    return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}

フルスクリーンコントロールの通知を登録します。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:)
                                             name:MPMoviePlayerWillEnterFullscreenNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:)
                                             name:MPMoviePlayerWillExitFullscreenNotification
                                           object:nil];

次に、プレーヤーコントローラーにコード行を追加します。

- (void)moviePlayerWillEnterFullscreenNotification:(NSNotification *)notification
{
dispatch_async(dispatch_get_main_queue(), ^
               {
                   self.allowRotation = YES;
               });
}



- (void)moviePlayerWillExitFullscreenNotification:(NSNotification *)notification
{
self.allowRotation = NO;
[self.moviePlayerController setControlStyle:MPMovieControlStyleNone];

dispatch_async(dispatch_get_main_queue(), ^
               {

                   //Managing GUI in pause condition
                       if (self.currentContent.contentType == TypeVideo && self.moviePlayerController.playbackState == MPMoviePlaybackStatePaused)
                   {
                       [self.moviePlayerController pause];
                       if (self.playButton.selected)
                           self.playButton.selected = NO;
                   }
                   self.view.transform = CGAffineTransformMakeRotation(0);
                   [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
                   self.view.bounds = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
               });
}

このコードは、iOS6およびiOS7で正常に動作することをテストされています。ありがとう:)

ご不明な点がございましたら、お気軽にお問い合わせください。

11
Vijay Sharma

サポートされているインターフェイスの向きとして、ランドスケープをサブクラス化して提供する必要があります。

@interface MyMovieViewController : MPMoviePlayerViewController
@end

@implementation MyMovieViewController

- (BOOL)shouldAutorotate 
{
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{
    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

@end
5
Srikanth

方向の更新を「強制」して、システムが正しい方向を処理できるようにすることができます。

- (void)forceOrientationRefresh
{
    // Force orientation refresh
    [self presentModalViewController:[UIViewController new]
                            animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}

それはハックっぽいですが、それは機能します。

2
Rivera

このようにプログラムで向きを変えることができます

-(void)viewDidAppear:(BOOL)animated
{

     if(UIDeviceOrientationIsPortrait(self.interfaceOrientation)){
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
        {
            objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft );

        }
    }

}

そして、#import <objc/message.h>を追加することを忘れないでください

0
Fran Martin

ビューコントローラをデバイスの方向に登録し、ビューコントローラの方向メソッドを強制的に呼び出すことができると思います。

0
abhishekkharwar

これはおかしなことに聞こえるかもしれませんが、ビデオビューコントローラを開く前に最後の方向をローカルに保存してから、application:supportedInterfaceOrientationsForWindow:を使用して保存された方向を返し、ビューコントローラをその上にとどめて回転させないようにしてください。

0

SupportIterfaceOrientationsForWindowを使用して、次を探します。 MPInlineVideoFullscreenViewController。正しいビューコントローラを見つけるのは少し難しいですが、機能します。

サンプルコードは次のとおりです。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    if ([NSStringFromClass([self.window.rootViewController.presentedViewController.presentedViewController class]) isEqualToString:@"MPInlineVideoFullscreenViewController"]){
    return UIInterfaceOrientationMaskAllButUpsideDown;
}
    return UIInterfaceOrientationMaskLandscape;
}
0
Övünç Metin