viewWillTransitionToSize и неправильная навигация Bar и statusBarFrame heights
Я пытаюсь получить видимую область рисования для подкласса GLKViewController. В iOS 7 я бы определил ориентацию и затем соответствующим образом настроил [UIScreen mainScreen].bounds.size. Тогда я бы вычел навигационные Bar и statusBarFrame высоты и вуаля! - фактический размер моей области рисования.
Сейчас я пытаюсь обновить iOS 8 с помощью viewWillTransitionToSize, однако, когда я поворачиваю устройство (у меня включена UIInterfaceOrientationMaskAll), переданный размер неверен. На самом деле ширина верна для вида, но не для высоты (которая включает в себя высоту панели навигации и строки состояния).
Я видел пару вопросов по 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
32 получается высота панели навигации в ландшафтном режиме (если это что-то значит).
Итак, мои вопросы: как viewWillTransitionToSize получает этот размер? Как он учитывает дополнительные полосы, которые меняют размеры или исчезают в зависимости от ориентации? И самое главное, почему он использует эти неправильные высоты?
1 ответ
При взгляде на размеры рамки просмотра 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)
{
}];
}