Как программно получить высоту строки состояния iOS

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

Ответ 1

[UIApplication sharedApplication].statusBarFrame.size.height. Но поскольку все размеры указаны в точках, а не в пикселях, высота строки состояния всегда равна 20.

Обновление. Если этот ответ считается полезным, я должен уточнить.

Высота строки состояния, действительно, равна 20.0f, за исключением следующих случаев:

  • строка состояния была скрыта с помощью метода setStatusBarHidden:withAnimation:, а ее высота равна 0.0f точек;
  • как отметил @Anton, во время входящего вызова вне приложения "Телефон" или во время записи строки состояния сеанса записи звучит 40.0f точек.

Здесь также отображается строка состояния, влияющая на высоту вашего представления. Обычно высота представления равна размеру экрана для заданной ориентации минус высота строки состояния. Тем не менее, если вы отображаете строку состояния (покажите или скройте ее) после отображения представления, строка состояния изменит свой фрейм, но представление не будет, вам придется вручную изменить размер представления после анимации строки состояния (или во время анимации с высота строки состояния устанавливается на конечное значение в начале анимации).

Обновление 2.. Также есть пример ориентации пользовательского интерфейса. Строка состояния не учитывает значение ориентации, поэтому значение высоты строки состояния для портретного режима [UIApplication sharedApplication].statusBarFrame.size.height (да, ориентация по умолчанию - это всегда портрет, независимо от того, что говорит ваше приложение info.plist), для пейзажа - [UIApplication sharedApplication].statusBarFrame.size.width. Чтобы определить текущую ориентацию пользовательского интерфейса, когда вне UIViewController и self.interfaceOrientation недоступно, используйте [UIApplication sharedApplication].statusBarOrientation.

Обновление для iOS7. Несмотря на то, что визуальный стиль строки состояния изменился, он все еще там, его кадр все еще ведет себя одинаково. Единственная интересная находка о статусной строке, которую я получил, я разделяю: ваш триангованный фон UINavigationBar также будет разбит на панель состояния, поэтому вы сможете достичь некоторых интересных эффектов дизайна или просто покрасить свою строку состояния. Это также не повлияет на высоту строки состояния.

Navigation bar tiled background is also tiled to status bar

Ответ 2

Пойдите с предложением Martin на вопрос: получите высоту строки состояния iPhone.

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

И в Swift

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

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

Старый ответ

Следующий код, который входит в ваш собственный подкласс UIViewController, почти работал для поддержки ландшафта. Но я заметил, что угловой футляр (при повороте справa > не поддерживается вверх ногами) слева, для которого он не работал (переключение высоты и ширины).

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

Ответ 3

Попробуйте следующее:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

Ответ 4

Swift 3 или Swift 4:

UIApplication.shared.statusBarFrame.height

Ответ 5

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

  • когда вы находитесь в середине телефонного звонка (это довольно распространенный сценарий);
  • когда диктофон, или Skype, или аналогичное приложение, использует микрофон в фоновом режиме;
  • когда активирована личная горячая точка;

Просто попробуй, и ты сам увидишь. Hardcoding высотой до 20pt обычно будет работать, пока это не произойдет.

Итак, второй ответ H2CO3:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

Ответ 6

EDIT UIView safeAreaLayoutGuide См. Документацию по UIView.

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

Ответ 7

Не забывайте, что рамка строки состояния будет в пространстве координат экрана! Если вы запускаете в ландшафтном режиме, вы можете обнаружить, что ширина и высота меняются местами. Я настоятельно рекомендую вам использовать эту версию кода, если вы поддерживаете ландшафтные ориентации:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

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

Кстати, не только индикатор состояния может быть выше во время телефонных звонков, он также может быть равен нулю, если строка состояния была намеренно скрыта.

Ответ 8

Вот быстрый способ получить высоту строки состояния экрана:

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

Они включены как стандартная функция в моем проекте: https://github.com/goktugyil/EZSwiftExtensions

Ответ 10

Я просто нашел способ, который позволяет вам не напрямую обращаться к высоте строки состояния, а вычислять его.

Высота панели навигации - topLayoutGuide length = высота строки состояния

Swift:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.length - верхняя область, покрытая полупрозрачной панелью, а self.navigationController?.navigationBar.frame.height - это полупрозрачная панель, за исключением строки состояния, которая обычно равна 44pt. Таким образом, используя этот метод, вы можете легко вычислить высоту строки состояния, не беспокоясь о изменении высоты строки состояния из-за телефонных звонков.

Ответ 11

Для iOS 13 вы можете использовать:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

Ответ 12

Используя следующий код с одной строкой, вы можете получить высоту строки состояния в любой ориентации, а также если она видна или нет.

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

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