2013-05-08 6 views
13

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

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

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

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

+0

В строке состояния вызова будет отображаться поведение, которое вы можете проверить даже после выхода из приложения. Это «переключатель в строке состояния вызова». Не знаю о красном фоне. – Amit

+0

Похож на аналогичный вопрос: http://stackoverflow.com/questions/25882609/how-to-do-layout-to-handle-in-call-double-height-status-bar-for-custom-present/42507117 # 42507117 – hhamm

ответ

7

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

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

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

  1. Выборочная Просмотр контроллера является контроллер представления корневого окна,
  2. Выборочная View Controller является дочерним элементом UINavigationController который является контроллером вид корневого окна,
  3. в Пользовательский контроллер просмотра является дочерним элементом UITabBarController, который является контроллером корневого окна окна и
  4. Контроллер пользовательского вида является дочерним элементом UINavigationController, который является дочерним элементом UITabBarController, который является контроллером корневого представления окна.

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

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

+0

didnot work for me –

2

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

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

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

Другой подход с вашей AppDelegate, реализации:

-application:willChangeStatusBarFrame: 

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

7

Для получения ответа на чисто автоматический макет вы можете получить ссылку на нижнее ограничение и настроить его константу при получении 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 
Смежные вопросы