2010-10-08 2 views
57

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

[[UIApplication sharedApplication] statusBarFrame] 

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

+0

Как может быть состояние 40px? – Andy

+0

@ Andy при активном подключении высота строки состояния увеличивается до 40px –

+0

Или когда звонок приходит в – SwiftMatt

ответ

78

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

Вызов этого метода в '- [UIViewController viewWillAppear:]' не работает. Два вопроса: 1. Окно вида - «nil». 2. Даже когда мне предшествовал вызов '- [UIWindow convertRect: fromWindow:]' с 'if (view.window)', когда я возвращался к контроллеру представления в ландшафтном режиме, statusBarFrame имел ширину и высоту, и вызов '- [UIView convertRect: fromView:]' не вернул их правильно. – ma11hew28

+0

@MattDiPasquale Почему бы не назвать его в 'viewDidAppear:' вместо этого? – ThomasW

+1

Потому что я настраиваю 'self.collectionView.contentInset' на основе' [UIApplication sharedApplication] .statusBarFrame'. Если я отрегулирую его после появления представления, вы увидите, как он прыгает. Поэтому я должен настроить его перед представлением. – ma11hew28

13

ли вы сделать это следующим образом:

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

Да, я. Я упомянул об этом в своем первоначальном вопросе. –

+19

Вы также можете использовать NSStringFromCGRect: 'NSLog (@" Statusbar frame:% @ ", NSStringFromCGRect (rect));' – progrmr

+4

Как все это связано с проблемой ??? – Andy

5

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

+0

Спасибо! [Я реализовал эту идею] (http://stackoverflow.com/a/16598350/242933). Здорово! – ma11hew28

5

Этот метод работает для портрета & ландшафтная ориентация.

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

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

, не могли бы вы предоставить более подробную информацию о своем решении, спасибо! –

+0

Это может быть использовано в реализации ViewController. Например, в методе 'viewDidLoad'. –

5

EDIT КСН 11 способ работы, где поставить верхнюю часть вашего контента зрения является UIView-х safeAreaLayoutGuide См UIView Documentation.

РЕКОМЕНДУЕТСЯ ОТВЕТ Если вы ориентируетесь IOS 7+, документация для UIViewController советует topLayoutGuide собственность ViewController дает вам в нижней части строки состояния, или в нижней части панели навигации, если это также видно. Это может быть полезно и, конечно же, менее взломано, чем многие из предыдущих решений.

0

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

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

Это входит в качестве стандартной переменной:

https://github.com/goktugyil/EZSwiftExtensions

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

3

Swift 2:

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

Swift 3 или 4 Swift:

let statusBarHeight = UIApplication.shared.statusBarFrame.height 

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

+1

Почему я не хочу использовать синглтон? –

 Смежные вопросы

  • Нет связанных вопросов^_^