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

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

  1. Создать проект с включенным "Использовать раскадровки"
  2. Добавьте "View Controller" и включите его "Is Initial View Controller"
  3. Установить красный цвет фона контроллера на красный
  4. Добавьте "Table View" в представление контроллера

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

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

3 ответа

Решение

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

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

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

  1. Custom View Controller является корневым контроллером представления окна,
  2. Custom View Controller является дочерним для UINavigationController, который является корневым контроллером представления окна,
  3. Custom View Controller является дочерним для UITabBarController, который является корневым контроллером представления окна и
  4. Пользовательский контроллер представления является дочерним по отношению к UINavigationController, который является дочерним по отношению к UITabBarController, который является корневым контроллером представления окна.

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

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

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

@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

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

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

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

Другой подход с вашим AppDelegate, воплощать в жизнь:

-application:willChangeStatusBarFrame:

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

Другие вопросы по тегам