Можна використовувати щось подібне UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) визначення орієнтації, а потім відповідно використовувати розміри.
ТАКОЖ, під час зміни орієнтації, як у UIViewController's
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Використовуйте передану орієнтацію, toInterfaceOrientationоскільки статусBarOrientation статусу UIA додатка все одно вказуватиме на стару орієнтацію, оскільки вона ще не змінилася (оскільки ви всередині willобробника подій).
Підсумок
До цього є кілька пов’язаних повідомлень, але, здається, кожна з них вказує на те, що вам потрібно:
- Подивіться,
[[UIScreen mainScreen] bounds]щоб отримати розміри,
- Перевірте, в якій орієнтації ви перебуваєте, та
- Облік висоти рядка стану (якщо показано)
Посилання
Робочий кодекс
Зазвичай я не заходжу так далеко, але ти викликав мій інтерес. Наступний код повинен зробити трюк. Я написав категорію щодо застосування UIA. Я додав методи класу для отримання currentSize або розміру в заданій орієнтації, що саме ви називали б у UIViewController willRotateToInterfaceOrientation:duration:.
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Для використання коду простий дзвінок [UIApplication currentSize]. Крім того, я запустив наведений вище код, тому знаю, що він працює, і повідомляю правильні відповіді у всіх напрямках. Зверніть увагу, що я враховую рядок стану. Цікаво, що мені довелося відняти MIN висоти та ширини рядка стану.
Сподіваюся, це допомагає. : D
Інші думки
Ви можете зайнятися отриманням розмірів, переглянувши rootViewControllerвластивість UIWindow . Я дивився на це в минулому, і він аналогічним чином повідомляє про однакові розміри як у портретному, так і в альбомному режимі, за винятком того, що він повідомляє про обертання:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] подання]
<UILayoutContainerView: 0xf7296f0; кадр = (0 0; 320 480); перетворення = [0, -1, 1, 0, 0, 0]; автоматичний розмір = W + H; шар = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] подання]
<UILayoutContainerView: 0xf7296f0; кадр = (0 0; 320 480); автоматичний розмір = W + H; шар = <CALayer: 0xf729b80 >>
Не впевнений у тому, як працює ваша програма, але якщо ви не використовуєте якогось навігаційного контролера, ви можете мати UIView під основним видом з максимальною висотою / шириною батьківського і зростає / скорочується з батьківським. Тоді ви могли б зробити: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]. Це виглядає досить інтенсивно в одній лінії, але ви розумієте.
Однак ... Все-таки було б краще зробити вищезазначені 3 кроки під резюме. Почніть возитися з UIWindows, і ви дізнаєтесь дивні речі, як-от показ UIAlertView змінить клавіатурне вікно UIApplication, щоб вказати на нове вікно UIWart, яке створив UIAlertView. Хто знав? Я виявив помилку, покладаючись на keyWindow, і виявив, що вона так змінилася!