Разрыв в 20 пикселей сверху альбомной ориентации в приложении для iPhone, работающем на iPad - PullRequest
2 голосов
/ 03 октября 2010

Я запускаю приложение "только для iPhone" в симуляторе iPad ... Когда ориентация устройства изменяется на альбомный режим, у меня есть контроллер представления, который запускает и программно загружает WebView. В iPhone это работает плавно (без зазоров в верхней части альбомной ориентации), но при моделировании в iPad зазор 20px (я думаю?) В верхней части вида.

Вот код в viewDidLoad контроллера альбомной ориентации, куда я загружаю WebView:

    [super viewDidLoad];

// Initialize webview and add as a subview to LandscapeController's view
CGRect webFrame = [[UIScreen mainScreen] bounds]; // Use bounds to take up entire screen
self.myWebView = [[[UIWebView alloc] initWithFrame:webFrame] autorelease];
self.myWebView.scalesPageToFit = YES;
self.myWebView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
self.myWebView.delegate = self;
[self.view addSubview: self.myWebView]; 

// remove status bar from top of screen
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];

Установка строки состояния на значение по умолчанию, не влияет.

Я не могу понять, почему это было бы хорошо на iPhone, но появиться на iPad ??? Есть идеи? Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 03 октября 2010

Границы экрана указаны в экранных координатах.Вы добавляете веб-представление как подпредставление self.view;его кадр находится в координатах self.view.Вы хотите заполнить свой вид, а не экран (размер вашего вида автоматически изменяется с помощью UIViewController / остальной части UIKit, что должно привести к изменению размера веб-представления до автоматического изменения размера):

self.myWebView = [[[UIWebView alloc] initWithFrame:self.view.bounds] autorelease];

Это не такбезопасно изменить строку состояния в -viewDidLoad.Загрузка представления может происходить в любом месте (это происходит, когда что-либо вызывает viewController.view).Я также не уверен, почему вы устанавливаете стиль;Вы хотите установить скрытое:Наконец, вы можете увидеть другое поведение, потому что iPad работает под управлением ОС 3.2.x, а телефон работает под управлением 3.1.x или 4.x.Кроме того, в режиме совместимости с iPhone используется фиктивная строка состояния;«Реальная» строка состояния всегда остается по краям экрана.

0 голосов
/ 13 октября 2010

Я наконец понял это. Ключевой недостающий компонент, который я не упомянул в исходном посте, заключается в том, что контроллер представления, который управляет ландшафтом, фактически реализован как модальное представление. (См. Руководство пользователя View Controller для получения кода о том, как это сделать). В принципе, у меня есть контроллер Portrait View. (который является основным контроллером) В viewDidLoad контроллера вертикальной развертки я подаю заявку на оповещение, которое срабатывает при изменении ориентации, например:

- (void)viewDidLoad {
[super viewDidLoad];

// SECTION to setup automatic alternate landscape view on rotation
// Uses a delegate to bring the landscape view controller up as a modal view controller

isShowingLandscapeView = NO;
// Create Landscape Controller programmatically
self.landscapeViewController = [[LandscapeViewController alloc] initWithNibName:@"LandscapeViewController" bundle:[NSBundle mainBundle]];

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

// END SECTION landscape modal view controller

Тогда, когда ориентация меняется, этот метод называется:

- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
{
    // Load Landscape view
    landscapeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:self.landscapeViewController animated:YES];

    isShowingLandscapeView = YES;
}

В то же время я удалял строку состояния из метода viewWillAppear контроллера ландшафта:

- (void)viewWillAppear:(BOOL)animated
{
// remove status bar from top of screen
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:animated];

self.myWebView.delegate = self; // setup the delegate as the web view is shown
}

и здесь возникает проблема. Контроллер книжного представления фиксирует размеры экрана перед переходом в альбомную ориентацию в виде модального вида. Затем viewWillAppear в контроллере альбомного вида удаляет строку состояния.

Итак, решение состоит в том, чтобы переместить

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:animated];

инструкция для метода directionChanged в контроллере вертикальной ориентации, ДО перехода к модальной ориентации ландшафта.

- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
{
    // remove status bar from top of screen
    // NOTE: this must be declared BEFORE presenting the Modal View!!!! If it's not, the landscape view will
    //       contain an ugly white bar in place of the missing status bar at the top of the view.
    [[UIApplication sharedApplication] setStatusBarHidden:YES];

    // Load Landscape view
    landscapeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:self.landscapeViewController animated:YES];

    isShowingLandscapeView = YES;
}

Обратите внимание, что, как было упомянуто выше, если вы хотите, чтобы строка состояния отображалась при ориентации назад на Портрет, вам нужно

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:animated];

в методе viewWillDisappear в контроллере альбомной ориентации.

0 голосов
/ 03 октября 2010

20 пикселей вверху почти всегда неизменно связаны с высотой строки состояния.

Код, который вы разместили, выглядит хорошо ... для настройки UIWebView.Но вы добавляете его как подпредставление к контроллеру вида view.Как это размер?Что такое frame?

...