Изменить размер для строки состояния вызова?
Как я могу resize представления в ответ на строку состояния вызова в моем телефоне?
Я полагал, что это просто настройка свойств изменения размера, но они не включены для корневого UIView.
(Я думаю, что моя главная проблема здесь заключается в том, что я не знаю, что это называется, я не могу найти ссылку на строку состояния вызова в любой документации, кроме случаев, когда она говорит о команде меню симулятора.)
- Android: как заголовок центра в ToolBar
- Изменение цвета фона отдельных элементов меню навигации
- c: forEach внутри перьев (например, p: panelgrid) внутри ui: repeat
- Цвет выбранной вкладки в нижней навигации
- как удалить тень под панелью действий с помощью AppCompat.Light.NoActionBar?
- Не удается уловить событие нажатия кнопки кнопки панели инструментов
- Как исправить метод getActionBar может вызвать java.lang.NullPointerException
- Как скрыть строку состояния iOS
- Как установить текст панели инструментов и цвет стрелки назад
- Контекстные стили Actionbar
- Избегайте панели в autoHide в расширении Firefox
- Как оживить Burger в Arrow с помощью Appcompat v7 21, панели инструментов и DrawerLayout
- Добавление вертикальной полосы прокрутки в AlertDialog в Android?
Что вы имеете в виду, когда говорите, что «свойства изменения размера не включены для корневого UIView»?
В строке состояния вызова нет специального специального обозначения, и я не думаю, что вокруг него есть какие-либо API-интерфейсы или уведомления. Вместо этого ваши взгляды должны быть просто настроены для автоматической проверки правильности.
Попробуйте создать новое приложение на основе навигации в Xcode и изучите параметры авторазрезания в представлении таблицы в RootViewController.xib. Надеюсь, вы увидите дельта между тем, что установлено Apple и тем, что вы установили в своем проекте.
iOS будет ссылаться на ваш viewController viewWillLayoutSubviews метод всякий раз, когда есть изменение в строке состояния. Вы можете переопределить это и настроить свои объекты в соответствии с новыми границами.
- (void)viewWillLayoutSubviews { // Your adjustments accd to // viewController.bounds [super viewWillLayoutSubviews]; }
Вы ищете – [UIApplication statusBarFrame], и в вашем UIApplicationDelegate вы должны реализовать этот метод делегата, чтобы получать уведомления о том, когда изменяется рамка строки состояния:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
Просмотр не может автоматически изменяться с изменением размера строки состояния, если у вас нет набора controllerов корневого представления. Первоначально я это делал в своем делете приложения, и мое приложение работало правильно во всех отношениях, за исключением того, что во время телефонных звонков оно не изменилось бы правильно.
[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
это работает для меня отлично, когда мое приложение работает в фоновом режиме, и я нажимаю команду + T. В моем сценарии корневой controller – это мой controller панели вкладок, и я перенастраиваю свой навигационный controller внутри каждой вкладки.
- (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; }];
}
Для таких представлений, как UITableView, вам обычно нужно изменить высоту ячейки таблицы, и нет другого способа сделать это, кроме как реализовать приложение: didChangeStatusBarFrame:. Но это не biggie, и вы можете установить высоту строки нецелыми значениями, если вам нужно.
Уведомление о смене кадра строки состояния
UIApplicationWillChangeStatusBarFrameNotification
Зарегистрируйтесь как наблюдатель:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
Затем ответьте на изменение в вашем обработчике:
- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }
Даже при правильной настройке автозапуска вам может потребоваться ответить на изменения. Например, представление таблицы, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может потребоваться reloadData
после изменения строки состояния.
Документация
У меня была такая же проблема. Я сделал это.
- Открыть файл xib в IB
- Все элементы интерфейса по умолчанию прикреплены для перемещения вместе с верхним и показаны в свойстве «Автосоздание» в «Настройщике размеров». Итак, для элементов пользовательского интерфейса в нижней части экрана удалите ссылку сверху и вместо этого сделайте ссылку снизу. Оставь все остальное как есть.
- Задача решена!!!
Надеюсь, я поняла.
Вам придется обновлять представления вручную, если вы программно настраиваете frameworks просмотра
-(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]; }
Это дает вам новую высоту строки состояния, и с ее помощью вы можете соответствующим образом обновить свои фреймы.
Решение состоит в том, чтобы убедиться, что вы сделали свой оконный ключ:
[window makeKeyAndVisible];
Если вы этого не сделаете, subview не будет автоматически изменяться, но, насколько мне известно, никаких других симптомов нет.
Ни одно из решений, опубликованных ранее, не работало для меня. Что для меня работало, так это то, что у меня не было ограничений, установленных для моих взглядов. В моей ситуации у меня было два разных вида контейнера в моем представлении.
Нижним (в списке) видом контейнера был UITableView
, который не прокручивался правильно в нижней части таблицы. Причина заключалась в том, что смещение строки состояния в вызове вызывало изменение UITableView
поля (верхний левый угол) UITableView
, но размер оставался бы таким же. Это означало, что нижняя часть таблицы была выключена!
Решение состояло в том, чтобы правильно установить ограничение высоты авторезистировки . На скриншоте, приведенном ниже, это вертикальные стрелки в середине windows Autoresizing .