UITabBarController с viewControllers, используя разные ориентации? - PullRequest
2 голосов
/ 09 июня 2010

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

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

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

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

    return canRotate;
}

Теперь «трюк» заключается в том, что когда я могу-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 в viewController?

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

Надеюсь, я близко и что кто-то может помочь мне добраться туда,спасибо:)

1 Ответ

1 голос
/ 10 июня 2010

Я думаю, что могу упростить все это .... <pre> - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return NO; }</p> <p>-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];</p> <pre><code> 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];

}

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

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

...