UITabBarController с viewControllers, использующими различные ориентации?


Я вижу, что это то, что беспокоит многих людей:/

У меня есть UITabBarController, который имеет 4 ViewController, все типа UINavigationController. Один из навигационных контроллеров получает viewController, помещенный в его стек, этот viewController должен быть представлен в ландшафтном режиме / ориентации.

ViewController-это график, это абсолютно единственное место в приложении, где ландшафт имеет смысл. (Я скрываю UITabBar, когда это представлено не заставляйте пользователя верить, что это будет работать везде)

Чтобы заставить UITabBarController правильно реагировать на изменения ориентации, все его viewControllers должны возвращать одно и то же значение из метода делегата:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Таким образом, чтобы приспособить это поведение, я реализовал этот метод во всех viewControllers, принадлежащих UITabBarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

"фишка" теперь в том, что когда мой can-be-landscape 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 в NO, этот "старый" viewController не может вращаться назад когда я ориентирую устройство в портретном режиме.

Есть ли способ обновить все так, чтобы ни один из моих других ViewController не был в ландшафтном режиме, когда я открываю can-be-in-landscape mode viewController?

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

Надеюсь, что я близок и что кто-то мог бы помочь мне добраться туда, СПАСИБО:)

1 2

1 ответ:

Я думаю, что могу все упростить.... {[0]}

- (void) viewDidAppear: (BOOL)анимированный { [UIView beginAnimations:@" View Flip " контекст: ноль]; [UIView setAnimationDuration: 0.5 f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    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);

/ /[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

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

Если вы не всегда хотите, чтобы этот вид поворачивался, то у вас есть немного более сложная проблема - вы можете проверить значения акселерометра, чтобы выяснить, в какую сторону находится телефон (или можно было бы предположить, в какую сторону телефон был повернут вызовами shouldAutotateToInterfaceOrientation, а затем просто вызвать код преобразования, как и когда вам нужно.