Изменить размер строки состояния вызова? - PullRequest
23 голосов
/ 12 июля 2009

Как мне изменить размер моего представления в ответ на строку состояния входящего вызова от моего пера?

Я подумал, что это просто установит свойства изменения размера, но они не включены для корневого UIView.

(Я думаю, что моя главная проблема в том, что я не знаю, как это все называется; я не могу найти ссылки на строку состояния в вызове ни в одной документации, кроме случаев, когда говорится о меню симулятора. команда.)

Ответы [ 11 ]

24 голосов
/ 30 ноября 2011

iOS будет вызывать метод viewWillLayoutSubviews вашего viewController при каждом изменении строки состояния. Вы можете изменить это и настроить свои подпредставления в соответствии с новыми границами.

- (void)viewWillLayoutSubviews {
    // Your adjustments accd to 
    // viewController.bounds

    [super viewWillLayoutSubviews];
}
16 голосов
/ 12 июля 2009

Вы ищете - [UIApplication statusBarFrame], и ​​в вашем UIApplicationDelegate вы должны реализовать этот метод делегата, чтобы получать уведомления об изменении кадра строки состояния:

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame  
7 голосов
/ 04 июля 2013

это прекрасно работает для меня, когда мое приложение работает в фоновом режиме, и я нажимаю команду + T. В моем сценарии корневой контроллер - это контроллер панели вкладок, и я перенастраиваю свой контроллер навигации внутри каждой вкладки.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{
[UIView animateWithDuration:0.35 animations:^{
    CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame;
    if (newStatusBarFrame.size.height > 20) {
        windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20
    }
    else{
        windowFrame.origin.y = 0.0;
    }
    ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame;
}];

}

7 голосов
/ 27 февраля 2013

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

[self.window addSubview:rootController.view];

Я изменил приведенную выше строку на эту, и теперь мое приложение автоматически изменяет размеры во время звонков.

[self.window setRootViewController:rootController];

Я обнаружил это исправление, увидев это в журнале и выяснив причину.

Application windows are expected to have a root view controller at the end of application launch
6 голосов
/ 12 июля 2009

Что вы имеете в виду, когда говорите, что «свойства изменения размера не включены для корневого UIView»?

Строка состояния в вызове не имеет какого-либо специального специального обозначения, и я не думаю, что вокруг нее есть какие-либо API или уведомления. Вместо этого ваши представления должны быть просто настроены на автоматическое изменение размера.

Попробуйте создать новое приложение на основе навигации в XCode и изучить параметры авторазмера в табличном представлении в RootViewController.xib. Надеюсь, вы увидите разницу между тем, что установлено Apple, и тем, что вы установили в своем проекте.

3 голосов
/ 06 ноября 2009

Для таких представлений, как UITableView, вам обычно нужно изменить высоту ячейки таблицы, и нет другого способа сделать это, кроме как реализовать application: didChangeStatusBarFrame: . Но это не важно, и вы можете установить высоту строки в нецелые значения, если вам нужно.

2 голосов
/ 23 января 2015

Уведомление о смене строки состояния строки:

UIApplicationWillChangeStatusBarFrameNotification

Зарегистрироваться в качестве наблюдателя:

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

Затем ответьте на изменения в вашем обработчике:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

Даже при правильной настройке автопоставки вам может потребоваться реагировать на изменения. Например, табличное представление, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может нуждаться в reloadData после изменения строки состояния.

Документация

1 голос
/ 30 ноября 2015

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

 -(void) viewDidAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

}

- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
NSLog(@"STATUS BAR UPDATED");
NSDictionary *statusBarDetail = [notification userInfo];
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey];
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue];
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width;

NSLog(@"status bar height  %d", statusBarHeight);
}

-(void) viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil];
}

Это дает вам новую высоту строки состояния, и с ее помощью вы можете соответствующим образом обновить свои рамки.

1 голос
/ 13 мая 2011

У меня была такая же проблема. Что я сделал, так это.

  1. Открыть файл xib в IB
  2. Все элементы интерфейса по умолчанию прикреплены для перемещения вместе с верхом и отображаются в свойстве «Авторазмер» в «Инспекторе размеров». Таким образом, для элементов пользовательского интерфейса внизу экрана удалите ссылку сверху, а вместо этого сделайте ссылку снизу. Оставь все остальные как есть.
  3. Проблема решена !!!

Надеюсь, я был чист.

0 голосов
/ 25 ноября 2014

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

View of scene in storyboard.

Нижним (в списке) контейнерным представлением было UITableView, которое неправильно прокручивалось к нижней части таблицы. Причина заключалась в том, что смещение строки состояния вызова вызывало изменение источника (верхний левый угол) UITableView, но размер оставался таким же. Это означало, что нижняя часть таблицы была за кадром!

Решение состояло в том, чтобы правильно установить ограничение высоты Autoresizing . На скриншоте ниже это вертикальные стрелки в середине поля Autoresizing .

enter image description here

...