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 подзаголовка находится в этой функции.