Изменить размер строки состояния во время разговора?

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

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

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


person Steven Fisher    schedule 11.07.2009    source источник


Ответы (11)


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

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

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

person Aaron Brethorst    schedule 11.07.2009
comment
Я, наверное, и здесь употребляю неправильный термин. В принципе, у меня есть xib с UIView. Выбрав UIView и просмотрев свойства изменения размера, я могу щелкнуть верхнее / нижнее и левое / правое соединение, но горизонтальное и вертикальное в центре не реагирует на щелчки. - person Steven Fisher; 12.07.2009
comment
Создал новый UIView в xib, и я могу управлять им. Кажется, что-то не так с этим UIView в xib. Поэкспериментируем еще немного и отметим это как решение, если так. - person Steven Fisher; 12.07.2009
comment
Да, похоже, что с этим UIView что-то не так. Спасибо. - person Steven Fisher; 12.07.2009
comment
Отключите все моделируемые метрики в XIB, если вам нужно изменить рамку просмотра и маску автоизменения размеров из IB: как только вы установите одну смоделированную метрику, например, стиль строки состояния, или имитируйте нижнюю панель вкладок или панель навигации вверху. Заставьте IB отключить возможность изменения кадра просмотра и ARM вручную, особенно потому, что он рассчитывает их в соответствии с этими смоделированными метриками. - person AliSoftware; 18.06.2011
comment
На самом деле есть уведомление о том, что строка состояния изменится: UIApplicationWillChangeStatusBarFrameNotification. И даже при правильной настройке автоматического раскладки вам может потребоваться отреагировать на смену кадра. Например, табличное представление, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может потребовать reloadData после изменения строки состояния. - person sabajt; 23.01.2015

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

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

    [super viewWillLayoutSubviews];
}
person Santhos Ramalingam    schedule 30.11.2011
comment
Что ж, если вы измените границы здесь, он viewWillLayoutSubviews будет снова вызываться рекурсивно. - person Rivera; 02.09.2015
comment
Странно, что viewController получает уведомление, но не меняет размер, не сжимает высоту, есть идеи, почему? - person János; 05.10.2015
comment
Здорово! Вы можете обновить свой contentFrame, который вы можете использовать в качестве константы в своем UIViewController здесь, а также до self.view.bounds, чтобы смещение распространялось по всей иерархии вашего представления. - person serge-k; 23.02.2016

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

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame  
person Mike McMaster    schedule 11.07.2009
comment
Майк, не могли бы вы уточнить: означает ли это, что я должен вручную изменять размер элементов в моих представлениях в коде? Ага! - person Steven Fisher; 12.07.2009
comment
Я не понимаю, почему, если свойства автоизменения размера вашего вида установлены правильно. Но да, писать код - какое ужасное неудобство. :-) - person Mike McMaster; 12.07.2009
comment
Пометка другого как принятого, потому что он указал, что то, что я пытался сделать, должно сработать в первую очередь, но большое вам спасибо. :) - person Steven Fisher; 12.07.2009
comment
Этот метод не вызывается, когда строка состояния меняет высоту в результате завершения вызова. Насколько я могу судить, он вызывается только при повороте вида. - person Jonah; 20.04.2010

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

[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
person Wade    schedule 27.02.2013
comment
Боже, это! Это решило мою проблему, после того как я потратил несколько часов на настройку полноэкранных свойств почти всего! - person ArkReversed; 29.07.2014

это отлично работает для меня, когда мое приложение работает в фоновом режиме, и я нажимаю команду + 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;
}];

}

person megha    schedule 04.07.2013
comment
В этом не должно быть необходимости; Я думаю, что в шаблонах Xcode есть ошибка. Я исправил это, удалив + воссоздав контроллер представления. Новый отвечает так, как я ожидал. - person Steven Fisher; 04.07.2013
comment
Я исправил это, в моем случае я вставил контроллер панели вкладок внутри контроллера навигации, поэтому он вызывал проблемы. Теперь все работает без сбоев. Теперь контроллер панели вкладок является моим корневым контроллером, и я перенастраиваю вид контроллера навигации внутри контроллера панели вкладок. - person megha; 05.07.2013

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

person Scott Lahteine    schedule 06.11.2009
comment
За исключением этого application: didChangeStatusBarFrame: и сопутствующее уведомление никогда не отправляется для простого изменения кадра состояния. Попробуй :-) - person Steve Weller; 30.12.2009
comment
Я заметил это, когда попытался это сделать. Так как же нам справиться с изменением размера экрана? Интерфейс моего приложения скользит вниз, но при этом частично скрывается. - person Scott Lahteine; 30.12.2009

Уведомление о смене рамки строки состояния отображается

UIApplicationWillChangeStatusBarFrameNotification

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

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

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

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

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

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

person sabajt    schedule 23.01.2015

У меня была такая же проблема. Я сделал вот что.

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

Надеюсь, я был ясен.

person Bushra Shahid    schedule 13.05.2011
comment
Теперь мое представление не отображается, если я сделаю ссылку снизу. - person The iCoder; 16.10.2013

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

 -(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];
}

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

person genaks    schedule 30.11.2015

Решение состоит в том, чтобы убедиться, что вы сделали свой ключ окна:

[window makeKeyAndVisible];

Если вы этого не сделаете, размер подпредставления не изменится автоматически, но, насколько мне известно, других симптомов нет.

person Steve Weller    schedule 30.12.2009

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

Вид сцены в раскадровке.

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

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

введите описание изображения здесь

person mikeho    schedule 25.11.2014
comment
Моя первоначальная проблема, когда-то давно, заключалась в том, что эти стрелки были просто недоступны. Я так и не понял, почему, но воссоздание представления в контроллере представления исправило это. - person Steven Fisher; 27.11.2014