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

Автоматическая компоновка и строка состояния вызова

Я хотел бы спросить об Авто-макете и строке состояния вызова. Вот простой сценарий, демонстрирующий мою проблему:

  • Включить проект с использованием "Использование раскадровки"
  • Добавить "View Controller" и включить его "Контроллер начального просмотра"
  • Установить цвет фона контроллера на красный
  • Добавить "Просмотр таблицы" в представление контроллера

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

Теперь, когда я запускаю это приложение в Simulator и нажимаю + T, я вижу красный фон, когда отображается строка состояния вызова. Можно ли избавиться от этой ошибки?

4b9b3361

Ответ 1

(Использование ответа вместо комментария из-за отсутствия репутации, извините.)

Я столкнулся с этой проблемой и попытался, например. решение, указанное выше: для меня это не сработало.

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

  • Пользовательский контроллер просмотра является контроллером корневого окна,
  • Пользовательский контроллер просмотра является дочерним элементом UINavigationController, который является контроллером корневого окна,
  • Пользовательский контроллер просмотра является дочерним элементом UITabBarController, который является контроллером корневого окна и
  • Контроллер пользовательского вида является дочерним элементом UINavigationController, который является дочерним элементом UITabBarController, который является контроллером корневого окна.

Оказалось, что решение от CEarwood работает... когда пользовательский контроллер просмотра является дочерним элементом UINavigationController (случаи 2 и 4). Тем не менее, это не работает в случаях 1 и 3.

Я надеюсь, что эта информация полезна.

Ответ 2

Для ответа на чисто автоматический макет вы можете получить ссылку на нижнее ограничение и отрегулировать его константу при получении UIApplicationWillChangeStatusBarFrameNotification и вернуться к 0, когда получено уведомление DidChange. Здесь использовался тест VC:

@interface CEViewController ()

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint;

@end

@implementation CEViewController

- (void)viewDidLoad {
    [super viewDidLoad];        

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

- (void)statusBarFrameWillChange:(NSNotification *)note {
    NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey];

    self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height;
    [self.view setNeedsLayout];
}

- (void)statusBarFrameDidChange:(NSNotification *)note {
    self.bottomConstraint.constant = 0;
    [self.view setNeedsLayout];
}

@end

Ответ 3

Это эффект от изменения размера экрана.

Когда отображается строка состояния вызова, вид изменяется до размера, который он должен иметь при активной строке состояния вызова, а затем перемещается вниз, когда строка состояния меняет размер.

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

Другой подход к вашему AppDelegate, реализовать:

-application:willChangeStatusBarFrame:

и измените размер представления таблицы, чтобы покрыть бит, который открывается. Затем, когда вызывается - application:didChangeStatusBarFrame:, измените его размер до исходного размера.