Получите высоту строки состояния iPhone - PullRequest
60 голосов
/ 08 октября 2010

Мне нужно изменить размеры некоторых элементов по отношению к высоте строки состояния iPhone.Я знаю, что строка состояния обычно на 20 пунктов выше, но это не тот случай, когда она находится в режиме модема.Он удваивается до 40. Как правильно определить его высоту?Я пробовал

[[UIApplication sharedApplication] statusBarFrame]

, но это дает мне 20 x 480 в альбомной ориентации, что правильно, но затем это дает мне 320 x 40 в портретном.Почему это не дает мне противоположность этому (40 х 320)?

Ответы [ 7 ]

80 голосов
/ 12 августа 2011

StatusBarFrame возвращает кадр в экранных координатах. Я считаю, что правильный способ получить то, чему это соответствует в координатах вида, это сделать следующее:

- (CGRect)statusBarFrameViewRect:(UIView*)view 
{
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil];

    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil];

    return statusBarViewRect;
}

Теперь в большинстве случаев окно использует те же координаты, что и экран, поэтому [UIWindow convertRect:fromWindow:] ничего не меняет, но в случае, если они могут отличаться, этот метод должен делать правильные вещи.

15 голосов
/ 08 октября 2010

Ты сделал это так:

CGRect rect;

rect = [[UIApplication sharedApplication] statusBarFrame];
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
6 голосов
/ 09 декабря 2014

EDIT Способ iOS 11 определить, куда поместить верхнюю часть содержимого просмотра, - это safeAreaLayoutGuide UIView * См. Документация UIView .

УСТАРЕЛИ ОТВЕТ Если вы ориентируетесь на iOS 7+, документация для UIViewController рекомендует, чтобы свойство topLayoutGuide viewController давало вам нижнюю часть строки состояния или нижнюю часть панели навигации, если она также видна. Это может быть полезно, и, конечно, менее взломано, чем многие из предыдущих решений.

6 голосов
/ 29 июня 2014

Этот метод работает для портретной и альбомной ориентации.

-(float) statusBarHeight
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

// example call
float statusBarHeight = [self statusBarHeight];
5 голосов
/ 01 июня 2011

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

3 голосов
/ 19 января 2017

Swift 2:

let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height

Swift 3 или Swift 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height

Совет: Не забудьте ввести UIApplication.shared, а не просто использовать одиночный код в вашем коде.

0 голосов
/ 27 ноября 2015

Вот версия Swift, если кому-то это нужно:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

Это включено в качестве стандартной переменной в:

https://github.com/goktugyil/EZSwiftExtensions

Отказ от ответственности: это мой репо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...