Уитаббантроллер с ViewControllers с использованием различных ориентаций?
Вопрос
Я вижу, что это то, что беспокоит много людей: /
У меня есть UitabbarController, который имеет 4 ViewControllers, весь тип UinavigatingController. Одним из навигационно-компоновщиков получает ViewController на его стек, этот ViewController должен быть представлен в ландшафтном режиме / ориентации.
ViewController - это график, это абсолютно только место в приложении, где имеет смысл ландшафта. (Я прячую Uitabbar, когда это представлено не ведут пользователю верить, что это будет работать везде)
Чтобы сделать UITABBABONTROLLER правильно реагировать на изменения в ориентации, все его контрольные контроли должны возвращать одинаковое значение из метода делегата:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Итак, для размещения этого поведения я реализовал этот метод во всех просмотрах контролеров, принадлежащих к UitabbarController:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL canRotate = [defaults boolForKey:@"can_rotate"];
return canRotate;
}
«Хитрость» теперь, когда, когда мой скандинавский ViewController продвигается, я делаю это:
- (void) viewWillAppear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"can_rotate"];
[defaults synchronize];
}
И когда он выскочил, я делаю это:
- (void) viewWillDisappear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"can_rotate"];
[defaults synchronize];
}
Это работает очень хорошо. Когда ViewController находится в стеке, я могу повернуть устройство, а представление следует.
Проблема, однако, что, если пользователь нажал кнопку «Назад» на навигационномБаре, в то время как в ландшафте в режиме ландшафта, появившись, что высказывает ViewController к предыдущему ViewController, этот «старый» ViewController, конечно, также в ландшафтном режиме. Чтобы сделать все хуже, потому что я устанавливаю Bool на нет, этот «старый» ViewController не может вращаться назад, когда я ориентирую устройство в портрет.
Есть ли способ обновить все так, чтобы ни один из моих других контрольных контролеров не будет в ландшафтном режиме, когда я попрой режим Can-In-Laxtive ViewController?
Я немного волнулся, что если бы это можно было сделать из ландшафта к портрету, это также должно быть возможно от портрета на пейзаж, что делает моим «взломом» ненужным .. Но если это не может, то я вернулся к квадратному: /
Надеюсь, я близок и что кто-то мог помочь мне добраться туда, спасибо :)
Решение
Я думаю, что могу упростить все это ....
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}
- (Void) ViewDiDiDiDAppear: (Bool) Анимированные {[uiview reganimations: @ "Просмотр Flip" Контекст: nil]; [UIVIEW SetAnimationduration: 0.5f]; [UIVIEW SetAnimationCurve: UiviewanimationCurveSeaseinout];
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
self.view.center = CGPointMake(160.0f, 240.0f);
// [ShareDation Uiadicationation] .statusbarorrientation = uiinterfaceorientationlandscaperight;
[UIView commitAnimations];
[super viewDidAppear:animated];
}
Ничего не вращается, но вы тогда вручную вращаете вид, который вы хотите переместить. Если вам не нужна поддержка клавиатуры в представлении, вам не нужно менять статус значению.
Если вы не всегда хотите, чтобы этот взгляд вращался, у вас есть немного сложнее - вы можете проверить значения акселерометра, чтобы выяснить, каким способом подключен телефон (или может быть возможно, чтобы подразумевать, какой способ повернуть телефон Призывами к необходимости, а затем просто вызовите код преобразования как и когда вам нужно.