Iphone - Как изменить размер представления при переключении строки состояния вызова? - PullRequest
15 голосов
/ 16 октября 2010

Я создаю приложение для iphone с несколькими элементами внутри контроллера (например, панель вкладок, пользовательский интерфейс, панель инструментов и т. Д.). Все отлично работает, пока я не столкнулся с этой проблемой. Когда мое приложение запущено, я получил вызов, и он показывает «Панель состояния вызова», которая разрушила пользовательский интерфейс. Некоторые элементы перемещены вниз, потому что «Строка состояния вызова» занимает место сверху.

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

Ваш ответ очень ценится ...

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

Ответы [ 4 ]

22 голосов
/ 09 февраля 2011

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

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

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

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

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

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

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

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}
12 голосов
/ 16 октября 2010

Вы должны поставить эту функцию на 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];
}
3 голосов
/ 16 октября 2010

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

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

1 голос
/ 18 мая 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...