Получить статус айфона Высота бар

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

[[UIApplication sharedApplication] statusBarFrame]

но это дает мне 20 x 480 в ландшафте, который является правильным, но затем он дает мне 320 x 40 в портрете. Почему он не дает мне противоположность этому (40 x 320)?

7 ответов


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

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


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

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

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

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

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

редактировать На iOS 11 способ выяснить, где поставить верхний контент наследник UIView это safeAreaLayoutGuide посмотреть Документация UIView.

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


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


Swift 2:

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

Swift 3 или Swift 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height

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


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

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

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

https://github.com/goktugyil/EZSwiftExtensions

отказ от ответственности: это мой РЕПО