Рамка строки состояния изменяется без уведомления

Я зарегистрировался для получения уведомлений об изменениях рамки строки состояния, но они никогда не приходят.

Вот как я регистрируюсь для получения уведомления:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(appWillChangeStatusBarFrameNotification:)
                                             name:UIApplicationWillChangeStatusBarFrameNotification
                                           object:nil];

В некоторых местах нашего приложения мы показываем / скрываем строку состояния с помощью:

[[UIApplication sharedApplication] setStatusBarHidden:maximize
                                        withAnimation:UIStatusBarAnimationSlide];

Но он также может изменять размер при включении персональной точки доступа или во время телефонного звонка. Есть ли способ получить фактическую рамку строки состояния при ее изменении?

Этот вопрос подразумевает, что уведомления не работают из-за ошибки SDK, по крайней мере, для изменения ориентации. Это причина? Есть ли обходной путь?


person progrmr    schedule 07.10.2012    source источник
comment
Хммм ... у меня работает при изменении ориентации, но не с setStatusBarHidden. Меня действительно вызывают, когда я имитирую телефонный звонок на симуляторе.   -  person rdelmar    schedule 08.10.2012


Ответы (1)


Я знаю, что этот вопрос был опубликован некоторое время назад, но эта проблема меня раздражает! Уведомления UIApplicationWillChangeStatusBarFrameNotification и UIApplicationDidChangeStatusBarFrameNotification срабатывают только при изменении ориентации и высоты строки состояния во время вызова.

Я решил эту проблему, написав свою собственную функцию категории setStatusBarHidden, которую я использую вместо обычной функции UIApplication. К сожалению (как указал @progrmr), поскольку высота строки состояния может составлять 20 пикселей или 40 пикселей (и мы не знаем, во что превратится скрытая рамка строки состояния, пока она не станет скрытой), мы можем только надежно запустить одно уведомление с правильной информацией о пользователе (UIApplicationDidChangeStatusBarFrameNotification). Вот что я сделал:

@implementation UIApplication (statusBar)

- (void)setStatusBarHiddenWithNotification:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation
{
    if (self.statusBarHidden == hidden) return;

    [self setStatusBarHidden:hidden withAnimation:animation];
    [NSNotificationCenter.defaultCenter postNotificationName:UIApplicationDidChangeStatusBarFrameNotification
                                                      object:nil
                                                    userInfo:@{UIApplicationStatusBarFrameUserInfoKey: [NSValue valueWithCGRect:self.statusBarFrame]}];
}

@end

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

Надеюсь, это кому-то поможет!

person Mr. T    schedule 27.06.2013
comment
Предполагается, что строка состояния имеет высоту 20 пунктов, обычно это так, но иногда она составляет 40 (во время телефонного звонка, когда активна точка доступа и т. Д.), Но это хорошая идея. - person progrmr; 28.06.2013
comment
Хорошая точка зрения. Я не знал, что setStatusBarHidden фактически скрывает строку состояния во время разговора. Думал, только нормальную строку состояния скрывает. Что ж ... Я полагаю, вы можете изменить эту функцию, чтобы она запускала только уведомление UIApplicationDidChangeStatusBarFrameNotification и передавала фактическую высоту строки состояния в userInfo. - person Mr. T; 28.06.2013
comment
@progrmr Я исправил функцию категории, чтобы использовать statusBarFrame UIApplication. К сожалению, это означает, что мы больше не можем надежно запускать уведомление UIApplicationWillChangeStatusBarFrameNotification с правильным прикрепленным userInfo. - person Mr. T; 28.06.2013