0

私のアプリは縦向きのみですが、UIWebview を介して全画面ビデオを視聴するときに、ユーザーが横向きに回転できるようにしたいと考えています。いくつかの調査を行ったところ、これらの通知のオブザーバーとしてクラスを追加する必要があることがわかりました。

UIMoviePlayerControllerDidEnterFullscreenNotification UIMoviePlayerControllerWillExitFullscreenNotification

次のようにクラスをオブザーバーとして追加および削除します。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidEnterFullScreen:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullScreen:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
}

- (void)moviePlayerDidEnterFullScreen:(NSNotification *)notification
{
    self.videoPlayingFullScreen = YES;
}

- (void)moviePlayerWillExitFullScreen:(NSNotification *)notification
{
    self.videoPlayingFullScreen = NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.videoPlayingFullScreen)
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    return UIInterfaceOrientationMaskPortrait;
}

私の問題は、「UIMoviePlayerControllerWillExitFullscreenNotification」を受信しないことです。UIMoviePlayerControllerDidExitFullscreenNotification を使用できません。これは、ユーザーがフルスクリーン ビデオを横向きで見終わって「完了」を押すと、前のビュー コントローラーが縦向きである必要があるときに横向きにも表示されるためです。

ユーザーがフルスクリーンに「した」とき、フルスクリーンを「終了する」ときを検出する別の方法はありますか? それとも、私が見逃しているものがありますか?

編集: 私のアプリは iOS 7 専用です。

4

2 に答える 2

3

コールバックを取得していない理由はUIMoviePlayerControllerWillExitFullscreenNotification、オブザーバーとして自分自身を削除しているためですviewWillDisappear:

于 2013-10-02T15:38:16.070 に答える
0

これらのコールバックは文書化されていないため、Javascript イベント (H2CO3 がここで提案しているように) を使用して、ビデオの開始、終了、または一時停止を判断しました。

ちなみに私はYouTube Playerを使っています。

まず、UIWebview をセットアップし、ViewController をデリゲートとして設定します。

次に、HTML ファイルを UIWebview に読み込みました。

索引.html

<html>
    <body bgcolor=#8C1717 style="margin:0px;">
        <div id="ytplayer"></div>
        <script type="text/javascript">
            var tag = document.createElement('script');
            tag.src = "https://www.youtube.com/player_api";

            var firstScriptTag = document.getElementsByTagName('script')[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady()
            {
                player = new YT.Player('ytplayer',
                                       {
                                       height: 'videoHeight',
                                       width: 'videoWidth',
                                       videoId: 'videoID',
                                       playerVars: { 'showinfo':0, 'rel':0 },
                                       events: { 'onStateChange': onPlayerStateChange }
                                       });
            }

            function playerDidBeginPlaying()
            {
                document.location.href = "fake://video-began";
            }

            function playerDidEndPlaying()
            {
                document.location.href = "fake://video-ended";
            }

            var done = false;
            function onPlayerStateChange(event)
            {
                if (event.data == YT.PlayerState.PLAYING && !done)
                {
                    done = true;
                    playerDidBeginPlaying();
                }
                else if (event.data == YT.PlayerState.ENDED)
                {
                    playerDidEndPlaying();
                }
                else if (event.data == YT.PlayerState.PAUSED)
                {
                    playerDidEndPlaying();
                }
            }
        </script>
    </body>
</html>

ViewController の内部

    NSError *error = NULL;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
    NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

    if (error)
    {
#ifdef DEBUG
        NSLog(@"[YouTube Webview] Error: %@", [error description]);
#endif
    }

    [self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

webView:shouldStartLoadWithRequest:navigationType:次に、イベントが発生したときに通知を受け取るメソッドを実装しました。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] hasPrefix:@"fake://video-began"])
    {
        self.videoPlayingFullScreen = YES;

        return NO;
    }
    else if ([[[request URL] absoluteString] hasPrefix:@"fake://video-ended"])
    {
        self.videoPlayingFullScreen = NO;

        return NO;
    }

    return YES;
}
于 2013-10-02T18:44:51.453 に答える