UIScreen ApplicationFrame возвращает неправильный прямоугольник при запуске альбомной ориентации приложения (iPhone / iPad)

StackOverflow https://stackoverflow.com/questions/2664980

Вопрос

Возникли проблемы с получением правильных границ для моего приложения для iPad при запуске его в альбомном режиме.У меня есть соответствующие ключи, установленные в моем файле Info.plist, и мои контроллеры просмотра запускаются должным образом в альбомной ориентации (и портретной, естественно).

В моем applicationDidFinishLaunching: метод Я вызываю селектор после 3-секундной задержки, и этот метод вызывает [[UIScreen mainScreen] applicationFrame], но это возвращает мне портретную рамку (т. е. высоту> ширину).

Кто-нибудь знает, как это исправить?Для меня это пахнет ошибкой (если это так, я отправлю запрос на радар), но если это предполагаемое поведение, где оно задокументировано?

Это было полезно?

Решение

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

Другие советы

Я никогда не полагаюсь на [[UIScreen mainScreen] applicationFrame], Особенно во время запуска приложения.

При создании представлений в коде используйте руководящий просмотр, чтобы установить кадр.

Если вы используете XIBS с «симулированными интерфейсными элементами», они будут правильно размещены, и все будет работать великолепно.

Приложения на основе UinaviGageController

В случае приложения на основе UinavigationController, возьмите кадр прямо из self.navigationController.view, не пытайтесь использовать [self loadView] а также self.view.superview. Отказ UinaviGrageController использует «скрытые» субветивы, чтобы сделать свою работу - поэтому прямое руководство не будет работать.

UinavigationController является особенным, потому что во время запуска приложения навигационный контроллер изменяет ваши виды после loadView позывается. При ауторезировании ударов у вас в конечном итоге с небольшим запасом в нижней части экрана.

Почему бы не экспресс

[[UIScreen mainScreen] applicationFrame] не работает надежно (особенно во время запуска приложения в ландшафте). Мой опыт заключается в том, что ViewController's interfaceOrientation Собственность не будет соответствовать applicationFrame Ориентация.

CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}

Это так, как я получаю правильный CGRCT, когда контроллер представления находится на ландшафте:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

Это как разработано. Вы должны запросить размер вашего руководства и настроить при необходимости.

[[UIScreen mainScreen] applicationFrame] Всегда будет возвращать портретный прямоугольник, даже если приложение находится в ландшафтном режиме. Это связано с тем, что UIWindow никогда на самом деле вращается, но просто меняет преобразование rootViewController.view вместо.

Чтобы убедиться, вы можете распечатать объект Root View в портретных и ландшафтных режимах, и вы увидите что-то вроде этого:

Портрет:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

Пейзаж:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...

Итак, добавьте запуск изображения и дайте ему суффикс -568H, согласно гидам Apple.

Я не понимаю, почему любой со звуковым разумом сделает системную настройку, зависящую от графики; Но я только что проверил, и это сработало.

Вот место, которое научило меня после быстрого поиска Я не видел этот ответ выше, подумал, что это будет полезно для кого-то.

С

Я столкнулся с такой же проблемой при отклонении представления с помощью dismissViewControllerAnimated в плагине Cordova.Я изменил код singingAtom для метода viewWillAppear в MainViewController, размер которого был изменен после отклонения модального представления:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top