Изменить размер строки состояния вызова?
Как я могу изменить размер своего представления в ответ на строку состояния входящего вызова от моего пера?
Я подумал, что это будет просто установить свойства изменения размера, но они не включены для корневого UIView.
(Я думаю, что моя главная проблема в том, что я не знаю, как это все называется; я не могу найти ссылки на строку состояния в вызове ни в одной документации, кроме случаев, когда речь идет о команде меню симулятора.)
11 ответов
Что вы имеете в виду, когда говорите, что "свойства изменения размера не включены для корневого UIView"?
Строка состояния в вызове не имеет какого-либо особого назначения, и я не думаю, что вокруг нее есть какие-либо API или уведомления. Вместо этого ваши представления должны быть просто настроены на автоматическое изменение размера.
Попробуйте создать новое приложение на основе навигации в XCode и изучить параметры автоматического изменения размера в табличном представлении в RootViewController.xib. Надеюсь, вы увидите разницу между тем, что установлено Apple, и тем, что вы установили в своем проекте.
iOS будет вызывать метод viewWillLayoutSubviews вашего viewController всякий раз, когда происходит изменение в строке состояния. Вы можете изменить это и настроить свои подпредставления в соответствии с новыми границами.
- (void)viewWillLayoutSubviews {
// Your adjustments accd to
// viewController.bounds
[super viewWillLayoutSubviews];
}
Вы ищете -[UIApplication statusBarFrame], и в вашем UIApplicationDelegate вы должны реализовать этот метод делегата, чтобы получать уведомления об изменении кадра строки состояния:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
Это прекрасно работает для меня, когда мое приложение работает в фоновом режиме, и я нажимаю команду + 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;
}];
}
Размер представления может не изменяться автоматически при изменении размера строки состояния, если у вас не установлен контроллер корневого представления. Первоначально я имел это в моем делегате приложения, и мое приложение работало должным образом во всех отношениях за исключением того, что оно не будет корректно изменяться во время телефонных звонков.
[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
Для таких представлений, как UITableView, вам обычно нужно изменить высоту ячейки таблицы, и нет другого способа сделать это, кроме как реализовать приложение: didChangeStatusBarFrame:. Но это не важно, и вы можете установить высоту строки в нецелые значения, если вам нужно.
Уведомление о смене строки состояния
UIApplicationWillChangeStatusBarFrameNotification
Зарегистрируйтесь в качестве наблюдателя:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
Затем ответьте на изменения в вашем обработчике:
- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
}
Даже при правильной настройке автопоставки вам может потребоваться реагировать на изменения. Например, табличное представление, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может потребоваться reloadData
после того, как строка состояния изменилась.
Вам придется обновить представления вручную, если вы устанавливаете свои рамки просмотра программно
-(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];
}
Это дает вам новую высоту строки состояния, и с ее помощью вы можете соответствующим образом обновить свои кадры.
У меня была такая же проблема. То, что я сделал, было этим.
- Откройте файл xib в IB
- Все элементы интерфейса по умолчанию прикреплены для перемещения вместе с верхом и отображаются в свойстве "Авторазмер" в "Инспекторе размеров". Таким образом, для элементов пользовательского интерфейса внизу экрана удалите ссылку сверху, а вместо этого сделайте ссылку снизу. Оставь все остальные как есть.
- Задача решена!!!
Надеюсь, мне было ясно.
Ни одно из ранее опубликованных решений не сработало для меня. Что сработало для меня, так это то, что у меня не были должным образом установлены ограничения для моих взглядов. В моей ситуации у меня было два разных вида контейнера.
Нижний (в списке) вид контейнера был UITableView
, который не был правильно прокручиваться в нижней части таблицы. Причина заключалась в том, что смещение строки состояния вызова вызывало источник (верхний левый угол) UITableView
изменить, но размер останется таким же. Это означало, что нижняя часть таблицы была за кадром!
Решением было правильно установить ограничение высоты Autoresizing. На скриншоте ниже, это вертикальные стрелки в середине поля Авторазмера.
Решение состоит в том, чтобы убедиться, что вы сделали свой ключ окна:
[window makeKeyAndVisible];
Если вы этого не сделаете, размер подпредставления не изменится автоматически, но, насколько я знаю, других симптомов нет.