2015-03-24 3 views
5

Я пытаюсь получить видимую область рисования для подкласса GLKViewController. В iOS 7 я бы определил ориентацию, а затем отрегулировал [UIScreen mainScreen] .bounds.size соответственно. Тогда я бы вычитал высоту navigationBar и statusBarFrame и вуаля! - фактический размер области рисования.viewWillTransitionToSize и неправильная навигацияBar и statusBarFrame высоты

Теперь я пытаюсь обновить для iOS 8 с viewWillTransitionToSize, однако, когда я поворачиваю устройство (у меня есть UIInterfaceOrientationMaskAll on), размер, который передан, неверен. Фактически, ширина является правильной для представления, но не высотой (которая включает в себя высоту навигационной панели и высоты строки состояния).

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

Это не кажется мне, что делать что-нибудь интересное, поправьте меня, если я ошибаюсь:

- (void)viewWillTransitionToSize : (CGSize) size 
     withTransitionCoordinator : (id<UIViewControllerTransitionCoordinator>) coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    NSLog(@"size changed : orig(%f,%f) mainScreen(%f,%f)", size.width, size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

    [self updateViews:size]; 
} 

выходы для перехода в альбомную:

size changed : orig(568.000000,256.000000) mainScreen(320.000000,568.000000) 

, где высота передается от viewWillTransitionToSize, как представляется:

320 - (2*32) = 256 

, а затем следующий поворот к портрету:

size changed : orig(320.000000,536.000000) mainScreen(568.000000,320.000000) 

где появляется высота передается от viewWillTransitionToSize быть:

568 - 32 = 536 

случается высота навигационной панели в ландшафтном режиме (если что-нибудь значит).

Так что мои вопросы: как viewWillTransitionToSize получает этот размер? Как это учитывает дополнительные бары, которые меняют размеры или исчезают в зависимости от ориентации? И что самое главное, почему он использует эти неправильные высоты?

+0

это тот же вопрос, я имею дело с сейчас - я получаю точно такие же номера, как вы получаете, когда мой экран вращается с той же несовпадения (32 или 64 балла). Проблема для меня в том, что я использую аргумент «размер» для получения новой высоты и ширины представления, а затем используя эти числа для вычисления размера подвид. – Natalia

ответ

12

При просмотре размеров рамок viewWillTransitionToSize:withTransitionCoordinationar: вы, скорее всего, получите кадры перед обновлением.

Лучше использовать animateAlongsideTransition:completion: внутри этого метода:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 


    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
      //update views here, e.g. calculate your view 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+0

Да - спасибо, много работало отлично! Я все еще не совсем понимаю, как работает viewWillTransitionToSize. Почему я должен получать фреймы до обновления, когда размер, указанный в параметрах, - это размер, на который происходит переход? Мне что-то не хватает? Размер после перехода определенно не является старым фреймом, но он не является правильным фреймом. – dragonflyesque

+0

Я столкнулся с той же проблемой, что и вы. Странная вещь: когда устройства поворачиваются с пейзажа вправо налево, появляется правильный кадр. Проблема возникает только при переходе от пейзажа к портрету и наоборот. – Tuslareb

+4

Это связано с тем, что при повороте между портретным и ландшафтным (или наоборот) новая высота баров еще не включена в параметр размера viewWillTransitionToSize.Но пейзаж в правом и ландшафтном лесах использует ту же навигационную панель и высоту панели инструментов, поэтому в этом случае нет необходимости ждать, пока эти полосы не будут изменены. Задача C полна такого сложного бизнеса, когда вам нужно использовать блоки завершения или функции отправки, чтобы получить правильное время. Далеко от тривиального и легко упускать из виду. – marcelnijman

Смежные вопросы