-1

私の webview は、ビデオを含む web ページを示しています。この Web ビューには、ナビゲーション バーとステータスバーが含まれています。

問題は、ビデオをランドスケープ モードで見てから WebView に戻った後、ビューの高さが変更されることです。そして、その時点で webview のどのメソッドも呼び出されていません。

ポートレートモードでの視聴では問題なく動作します。

ビューのスクリーンショットを次に示します。


動画視聴前 / 縦回転動画視聴後


横向き回転でビデオを見た後

ここに画像の説明を入力

なぜそれが起こるのですか?

4

2 に答える 2

1

ビデオを見た後、この行を追加してみてください..

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

アップデート:

- (void)viewWillAppear:(BOOL)animated
{
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update:) name:@"MPAVControllerPlaybackStateChangedNotification" object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update:) name:@"MPMoviePlaybackStateInterrupted" object:nil];
}

更新方法は次のとおりです...

#pragma mark - 
#pragma mark NSNotification Action

- (void)update:(NSNotification *)n {
    NSLog(@">>>>>>>>>>>>>>>>>>   Str Key ===>>%@",[NSNotificationCenter defaultCenter]);

    NSLog(@"\n\n\n\n\n>>>>>>>>>>> Updateing  >> %@ >>>>>>>>\n\n",[n description]);

    if ([[[n userInfo]objectForKey:@"MPAVControllerNewStateParameter"] intValue] == 0) {
        NSLog(@">>>>>>  1111111111111111111111111111111111111");
    }
    /*
     >>>>>>>>>>> Updateing  >> NSConcreteNotification 0x9c85740 {name = MPAVControllerPlaybackStateChangedNotification; object = <MPAVController: 0x6770010>; userInfo = {
     MPAVControllerNewStateParameter = 1;
     MPAVControllerOldStateParameter = 2;
     }}>>>>>>>>
     */

    if ([[[n userInfo]objectForKey:@"MPAVControllerNewStateParameter"] intValue] == 1 && [[[n userInfo]objectForKey:@"MPAVControllerOldStateParameter"] intValue] == 2  ) {
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
        //[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
    }


}
于 2012-12-24T06:46:13.327 に答える
0

私がなんとかそれを修正した方法は本当に簡単で、基本的にこれが問題の核心です: ビューを回転させ、NavigationController が新しい位置を再計算すると、ステータスバーが隠れた。その後、ステータスバーとナビゲーションバーの両方を表示すると重なってしまいます。

これを修正する方法は非常に簡単です。オーバーレイを表示するか非表示にするかを覚えておくために BOOL を保持し、ViewController に willRotateToInterfaceOrientation と willAnimateRotationToInterfaceOrientation の両方を実装するだけです。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (!isOverlayShowing)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
    }
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (!isOverlayShowing)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

これら 2 つのメソッドで StatusBar をすばやく表示および非表示にすることにより、NavigationBar がその位置を再計算する正確な瞬間に StatusBar が表示されます。これがこの問題を解決するための最良の実装であるかどうかはわかりませんが、これまでのところ、この方法は機能し、画面がちらつくこともなく、非常にスムーズです。

于 2012-12-24T06:47:28.793 に答える