2

я могу видеть, что это то, что было беспокоит много людей:/UITabBarController with viewКонтроллеры, использующие разные ориентации?

У меня есть UITabBarController, который имеет 4 viewControllers, все типа 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; 
} 

«трюк» теперь, что когда мой банк-быть-ландшафтной ViewController является Pushe d Я делаю это:

- (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, этот «старый» контроллер просмотра не может вращаться, когда я ориентирую устройство в портретный режим.

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

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

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

ответ

1

Я думаю, что может упростить все дело ....

 
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { 
return NO; 
}

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [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]; 

}

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

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

+0

Hi Andiih and Thanks :), что очень упрощает многое. Как заставить навигационную панель вращаться? – RickiG

+0

Ahh просто опробовал очевидное: \t self.navigationController.navigationBar.transform = CGAffineTransformIdentity; \t self.navigationController.navigationBar.transform = CGAffineTransformMakeRotation (90.0 * 0.0174532925); \t self.navigationController.navigationBar.bounds = CGRectMake (0.0f, 0.0f, 480.0f, 30.0f); \t self.navigationController.navigationBar.center = CGPointMake (160.0f, 240.0f); еще раз спасибо. – RickiG

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