Получить статус строки состояния iPhone

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

[[UIApplication sharedApplication] statusBarFrame]

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

Ответ 1

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:] ничего не меняет, но в случае, если они могут быть разными, этот метод должен поступать правильно.

Ответ 2

Сделали ли вы это так:

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);

Ответ 3

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

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

// example call
float statusBarHeight = [self statusBarHeight];

Ответ 4

ИЗМЕНИТЬ Способ iOS 11 для определения места размещения верхней части вашего представления - UIView safeAreaLayoutGuide См. Документация UIView.

ОТКЛЮЧЕННЫЙ ОТВЕТ Если вы ориентируетесь на iOS 7+, документация для UIViewController сообщает, что свойство viewController topLayoutGuide дает вам нижнюю часть строки состояния или нижней части панели навигации, если она также видна. Это может быть полезно, и, конечно же, это не так сложно, как многие из предыдущих решений.

Ответ 5

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

Ответ 6

Swift 2:

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

Swift 3 или Swift 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height

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

Ответ 7

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

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

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

https://github.com/goktugyil/EZSwiftExtensions

Отказ от ответственности: его репо