iPhone - типичная проблема с полным экраном и строкой состояния - PullRequest
2 голосов
/ 17 марта 2011

В моем приложении по умолчанию видна строка состояния.И мое приложение поддерживает как альбомную, так и портретную ориентацию.Когда я хочу воспроизвести видео, я скрываю строку состояния, чтобы мое видео отображалось в полноэкранном режиме.И когда видео заканчивается, я возвращаю строку состояния.

Я использую следующий код для показа видео:

UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview:playerView]; 

(я не могу использовать контроллеры представления в моемкод. Это ограничение)

Теперь проблема: мое приложение теперь в альбомной ориентации, при нажатии кнопки я скрываю строку состояния и начинаю воспроизведение видео.Когда воспроизводится видео, я меняю ориентацию телефона на портретную, и я позволил видео завершить.Когда видео завершено, устройство все еще находится в портретном режиме, вид плеера удаляется и снова отображается строка состояния.Теперь я заметил, что мой портретный вид перемещен на 20 пикселей вверх и выше, что отображается в строке состояния.Но когда я запустил приложение в первый раз, сначала отображается строка состояния, а под ней отображается мое представление.

Как мне справиться с этой ситуацией?

Для простого использования следующий код вконтроллер представления.

- (void)viewDidLoad {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [self performSelector:@selector(showStatusAgain) withObject:nil afterDelay:6.0];
    [super viewDidLoad];
}

-(void)showStatusAgain
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Когда вы запустите приложение с вышеуказанным кодом, оно запустится в портретной ориентации.теперь поверните его в ландшафт.и вы можете заметить проблему.

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

Я столкнулся с аналогичной проблемой, которую решил с помощью категории на UINavigationController.

UINavigationController + LayoutCorrecting.h:

@interface UINavigationController (LayoutCorrecting)

- (void)recalculateNavigationBarFrameRelativeToStatusBar;

@end

UINavigationController + LayoutCorrecting.m:

#import "UINavigationBar+LayoutCorrecting.h"

#import "UIViewAdditions.h"

@implementation UINavigationController (LayoutCorrecting)

- (void)recalculateNavigationBarFrameRelativeToStatusBar {
    CGRect sbf = [[UIApplication sharedApplication] statusBarFrame];

    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
        self.navigationBar.top = sbf.size.width;

    else
        self.navigationBar.top = sbf.size.height;
}

@end

Если вы немного подправите эту категорию, объявив ее в UIViewController и убедившись, что она настраивает controller.view.frame, а не navigationBar.top, я думаю, вам будет хорошо. Просто не забудьте вызвать метод category на вашем контроллере представления после того, как ваш фильм завершит воспроизведение, и вы уже показали строку состояния.

И просто для того, чтобы избежать путаницы, вероятно, стоит упомянуть, что вам нужно использовать ширину строки состояния в ландшафтном режиме, потому что система координат UIWindow всегда работает так, как если бы она находилась в портретном режиме, несмотря на как вы держите устройство. Это в отличие от подпредставлений (экземпляров UIView), которые управляются UIViewController, которые получают выгоду от автоматических преобразований координат.

P.S .: Так как вам придется настраивать рамку вашего вида в контексте окна, эта функция также может помочь.

CGRect CGRectOffsetRectForOrientation(CGRect rect, CGFloat dx, CGFloat dy, UIInterfaceOrientation orientation) {
    CGRect newRect = rect;

    switch (orientation) {
        case UIInterfaceOrientationPortrait:
            newRect.origin.x += dx;
            newRect.origin.y += dy;
            break;

        case UIInterfaceOrientationPortraitUpsideDown:
            newRect.origin.x -= dx;
            newRect.origin.y -= dy;
            break;

        case UIInterfaceOrientationLandscapeLeft:
            newRect.origin.y -= dx;
            newRect.origin.x += dy;
            break;

        case UIInterfaceOrientationLandscapeRight:
            newRect.origin.y += dx;
            newRect.origin.x -= dy;
            break;

        default:
            break;
    }

    return newRect;
}
0 голосов
/ 20 марта 2011

Попробуйте обновить стиль строки состояния при его отображении:

[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefualt];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...