Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

    [super viewWillLayoutSubviews];
}

Ответ 3

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

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame  

Ответ 4

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

[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

Ответ 5

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

}

Ответ 6

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

Ответ 7

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

UIApplicationWillChangeStatusBarFrameNotification

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

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

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

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

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

Documentation

Ответ 8

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

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

Надеюсь, я поняла.

Ответ 9

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

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

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

Ответ 10

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

[window makeKeyAndVisible];

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

Ответ 11

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

View of scene in storyboard.

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

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

enter image description here