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


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

[[UIApplication sharedApplication] statusBarFrame]

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

7 60

7 ответов:

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

- (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];

EDIT IOS 11 способ решить, где разместить верхнюю часть вашего контента просмотра-это UIView safeAreaLayoutGuide посмотреть UIView Documentation.

УСТАРЕВШИЙ ОТВЕТ Если вы ориентируетесь на 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

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