UIScreen ApplicationFrame возвращает неправильный прямоугольник при запуске альбомной ориентации приложения (iPhone / iPad)
-
27-09-2019 - |
Вопрос
Возникли проблемы с получением правильных границ для моего приложения для 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];
}