Как программно получить высоту строки состояния iOS
Я знаю, что в настоящее время строка состояния (со временем, батареей и сетевым подключением) в верхней части iPhone/iPad составляет 20 пикселей для экранов без сетчатки и 40 пикселей для экранов retina, но для будущего доказательства моего приложения я хотел бы иметь возможность определить это без жестких значений кодирования. Можно ли вычислить высоту строки состояния программно?
11 ответов:
[UIApplication sharedApplication].statusBarFrame.size.height. Но так как все размеры находятся в точках, а не в пикселях, высота строки состояния всегда равна 20.обновление. видя, что этот ответ считается полезным, я должен уточнить.
высота строки состояния, действительно, равна 20.0 F точек за исключением следующих случаях:
- строка состояния была скрыта с
setStatusBarHidden:withAnimation:метод и его высота равна 0.0 очков;- как здесь указал @Anton, во время входящего вызов вне приложения телефона или во время сеанса записи звука высота строки состояния равна 40,0 f точек.
есть также случай строки состояния, влияющей на высоту вашего зрения. Обычно высота вида равна размеру экрана для заданной ориентации минус высота строки состояния. Однако, если вы анимируете строку состояния (показать или скрыть ее) после отображения представления, строка состояния изменит свою рамку, но представление не будет, вам придется вручную изменять вид после анимации строки состояния (или во время анимации, так как высота строки состояния устанавливается в конечное значение в начале анимации).
обновление 2. есть также случай ориентации пользовательского интерфейса. Строка состояния не учитывает значение ориентации, поэтому значение высоты строки состояния для портрет режим
[UIApplication sharedApplication].statusBarFrame.size.height(да, ориентация по умолчанию всегда портретная, независимо от того, какая информация о вашем приложении.плист говорит), ибо пейзаж -[UIApplication sharedApplication].statusBarFrame.size.width. Чтобы определить пользовательский интерфейс текущая ориентация, когда за пределамиUIViewControllerиself.interfaceOrientationнедоступно, используйте[UIApplication sharedApplication].statusBarOrientation.обновление для iOS7. несмотря на то, что визуальный стиль строки состояния изменился, он все еще существует, его рамка по-прежнему ведет себя одинаково. Единственная интересная находка о строке состояния, которую я получил-я делюсь: your
UINavigationBar' s плиточным фон также будет выложен плиткой в строке состояния, так что вы можете достичь некоторых интересных эффектов дизайна или просто покрасить строку состояния. Это тоже не повлияет на статус высота адвокатского сословия в любом случае.
идете с предложение Мартина к вопросу: получить высоту строки состояния 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, почти работал для поддержки ландшафта. Но, я заметил угловой случай (при вращении справа > неподдерживаемый вверх ногами > слева), для которого он не работал (переключенная высота и ширина).BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait; CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size; CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
попробуйте это:
CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
хотя строка состояния обычно имеет высоту 20pt, в некоторых ситуациях она может быть вдвое больше:
- когда вы находитесь в середине телефонного звонка (это довольно распространенный сценарий);
- когда диктофон, или Skype, или аналогичное приложение, использует микрофон в фоновом режиме;
- при активации персональной точки доступа;
просто попробуйте, и вы увидите сами. Задаем высоту до 20 пунктов, как правило, будет работать, пока не нет.
поэтому я второй ответ H2CO3:
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
EDIT IOS 11 способ решить, где разместить верхнюю часть вашего контента просмотра-это UIView
safeAreaLayoutGuideпосмотреть UIView Documentation.УСТАРЕВШИЙ ОТВЕТ Если вы ориентируетесь на iOS 7+, документация для UIViewController сообщает, что viewController
topLayoutGuideсвойство дает вам нижнюю часть строки состояния или нижней части панели навигации, если она также видна. Это может быть полезно, и, конечно, меньше взломать, чем многие из предыдущее решение.
Не забывайте, что рамка строки состояния будет находиться в координатном пространстве экрана! Если вы запустите в ландшафтном режиме, вы можете обнаружить, что ширина и высота меняются местами. Я настоятельно рекомендую использовать эту версию кода вместо этого, если вы поддерживаете альбомную ориентацию:
CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];затем вы можете прочитать свойство высоты statusBarFrame напрямую. "Вид" в этом случае должен быть вид, в котором вы хотите использовать измерения, скорее всего, окно приложения корневой контроллер вида.
кстати, строка состояния может быть не только выше во время телефонных звонков, но и равна нулю, если строка состояния была намеренно скрыта.
вот быстрый способ получить высоту строки состояния экрана:
var screenStatusBarHeight: CGFloat { return UIApplication.sharedApplication().statusBarFrame.height }они включены в качестве стандартной функции в мой проект:https://github.com/goktugyil/EZSwiftExtensions
по умолчанию высота строки состояния в iOS составляет
20 pt.дополнительная информация:http://www.idev101.com/code/User_Interface/sizes.html
Я только что нашел способ, который позволит вам не напрямую получить доступ к высоте строки состояния, но вычислить ее.
высота панели навигации-длина topLayoutGuide = высота строки состояния
Swift:
let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height
self.topLayoutGuide.length- это верхняя область, которая покрыта полупрозрачной полосой, иself.navigationController?.navigationBar.frame.heightэто полупрозрачная панель, исключая строку состояния, которая обычно составляет 44pt. Таким образом, с помощью этого метода вы можете легко рассчитать высоту строки состояния, не беспокоясь о изменение высоты строки состояния из-за телефонных звонков.
используя следующий однострочный код, вы можете получить высоту строки состояния в любой ориентации, а также если она видна или нет
#define STATUS_BAR_HIGHT ( [UIApplicationsharedApplication].statusBarHidden ? 0 : ( [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ? [UIApplicationsharedApplication].statusBarFrame.size.width : [UIApplicationsharedApplication].statusBarFrame.size.height ) )Это просто простой, но очень полезный макрос просто попробуйте это, вам не нужно писать дополнительный код

Comments