2013-05-16 2 views
8

Я использую следующий код, чтобы получить высоту строки состояния:statusBarFrame.height возвращает 1024.0, когда в ландшафтном (IPad)

[UIApplication sharedApplication].statusBarFrame.size.height

Это прекрасно работает в портретном режиме и возвращает ожидаемое значение (20.0), но когда приложение находится в Landscape, я получаю неожиданное значение 1024.0!

Неужели кто-нибудь может пролить свет на это для меня?

IOS версии 6.1.3

XCode версия 4.6.2

ответ

10

Возможно, вам понадобится использовать [UIApplication sharedApplication].statusBarFrame.size.width на ландшафтной ориентации. То же, что и [[UIScreen mainScreen] applicationFrame] дает переключаемые значения в альбомной ориентации

+0

Нам нужна «высота», как «ориентация» имеет значение, так как «высота» одинакова? –

+2

Привет, извините, только что увидел комментарий ... не уверен, что вы имеете в виду, когда говорите «с высоты то же самое». Ориентация имеет значение, поскольку statusBarFrame использует фрейм внутри экранных координат. На портрете высота даст вам 20, но на ландшафте это ширина, которая дает значение, которое ищет @Ollie. –

+0

Высота строки состояния одинакова в обеих ориентациях. Изменяется только ширина. –

-1

Clean Создайте свой код и проверить, называются orientationChange методы. Просьба также указать версию iOS

+0

Я уже пробовал чистую сборку, и методы orientChange определенно получают называется. Я отредактировал исходное сообщение, чтобы показать версию iOS (6.1.3) – Ollie

+0

@Ollie: Тогда попробуйте отказаться от перезапуска 'Xcode' или построить с более низкой версией. –

+0

Это не был случай версии Xcode или не нуждался в чистой сборке. Симптомы присутствовали и в моих других проектах, и у моих коллег тоже. Попробуй сам. Тамара Бернад имеет правильное решение. – Ollie

4

Это совершенно правильно. statusBarFrame находится в экранных координатах. Вы должны использовать statusBarOrientation, чтобы проверить, следует ли переключать координаты.

+0

Этот ответ правильный, и я использовал его в сочетании с ответом Тамары Бернад, чтобы получить то, что мне нужно. Большое спасибо – Ollie

1

В какой момент приложения вы это получили? Если это первый запуск, проверьте, в какую ориентацию находятся ваши файлы .xib. Если они находятся в портрете, то даже при том, что приложение запускается в ландшафте, у него не было времени, чтобы определить ориентацию и использует размеры .xib, из которых он создает вид спереди.

В IOS 6 обнаружение обработки вращения и ориентация изменилось существенно от прошивки 5 и ниже, я считает, что вы можете больше не полагаться на ориентации строки состояния для этих значений.

this may help

+0

Это хорошее объяснение того, почему работает ответ Тамары. –

13

Используйте это, если вы хотите забыть о ориентации или координаты связанные с этим проблемы:

float statusBarHeight = MIN([UIApplication sharedApplication].statusBarFrame.size.height, [UIApplication sharedApplication].statusBarFrame.size.width); 
1

Вам не нужно проверить для ориентации, просто использовать удобный метод UIView для преобразование кадра:

CGRect statusBarFrame = [self.view convertRect:[[UIApplication sharedApplication] statusBarFrame] fromView:self.view.window]; 
+0

Доступ к высоте кадра, возвращаемого этим фрагментом, выполняется так же, как и другие ответы здесь, но он описывает, что происходит гораздо более четко. +1 –

Смежные вопросы