Iphone. Как изменить размер отображения, когда панель состояния звонка переключается?

Я создаю приложение iphone с несколькими элементами внутри контроллера (например, панель вкладок, uiview, uitoolbar и т.д.). Все работает нормально, пока я не столкнулся с этой проблемой. Пока мое приложение запущено, я получил звонок, и он показывает "Строка состояния вызова", которая разрушила ui. Некоторые элементы сдвинуты вниз, потому что "Строка состояния вызова" занимает место сверху.

У кого-нибудь есть идея о том, как исправить эту проблему? Я новичок в разработке приложений для iPhone.

Ваш ответ очень приветствуется...

С наилучшими пожеланиями,

Ответы

Ответ 1

Вы должны поместить эту функцию в appDelegate, это будет срабатывать при изменении строки состояния

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:@"trigger" forKey:@"frame"];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict];
}

Этот код отправит уведомление с именем "триггер"

Поместите код в свой вид Контроллер (например: viewDidLoad и т.д.), это прослушивание, если есть уведомление отправлено с именем "триггер"

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(dataReceived:)
                                             name:@"trigger"
                                           object:nil];

И создайте функцию dataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification {
    NSDictionary *data = [notification userInfo];
    // do something with data
}

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

И в dealloc, поместите этот код, чтобы удалить наблюдателя

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Ответ 2

dianz solutio работает просто отлично, но немного избыточно, если вас интересует только уведомление об уведомлении внутри определенного контроллера вида.

После вызова метода делегата application:didChangeStatusBarFrame: в делетете приложения UIApplicationDidChangeStatusBarFrameNotification отправляется через [NSNotificationCenter defaultCenter].

Вместо того, чтобы использовать метод делегата application:didChangeStatusBarFrame:, чтобы просто переназначить настраиваемое уведомление, вы можете добавить наблюдателя в UIApplicationDidChangeStatusBarFrameNotification прямо из вашего контроллера представления.

В MyCustomViewController вы добавите что-то похожее на это:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(doSomething:)
                                             UIApplicationDidChangeStatusBarFrameNotification
                                           object:nil];

Теперь вам больше не нужно определять метод делегата application:didChangeStatusBarFrame: в appDelegate (если вы не планируете что-то делать в appDelegate, когда строка состояния меняет размер).

Как и в примере с диаманзом, вам нужно удалить наблюдателя в dealloc

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Ответ 3

В основном то, что вы обычно делаете, - это попытаться настроить флаги автосохранения всех ваших элементов ui в построителе интерфейса, так что, когда основной вид "раздавлен" в строке состояния вызова, все будет выглядеть разумно. Немного трудно объяснить, как сделать все это в одном сообщении, но я рекомендую создать представление в IB, помещать в него некоторые подзапросы, а затем изменять размер основного представления во время игры с помощью флажков авторазмера, чтобы понять, как флаги Работа. Флаги автосохранения находятся в Command-3 (инспектор размера).

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

Ответ 4

для меня, всякий раз, когда строка состояния расширяется, всегда вызывается вид ((void) viewWillLayoutSubviews). Это идеально подходит для меня, потому что весь мой код subFrame подзаголовка находится в этой функции.