Проблема с ориентацией iPhoneSDK

#iphone #ios4 #iphone-sdk-3.0

#iPhone #ios4 #iphone-sdk-3.0

Вопрос:

У меня есть два вида, при первом просмотре у меня есть несколько кнопок, я хотел, чтобы этот вид был альбомным, поэтому я поместил этот код :

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

это работает нормально, поскольку мое приложение запускается в альбомном режиме. кнопки в этом представлении переводят пользователя ко второму виду, который я хотел использовать в портретном режиме. итак, я поместил этот код во второй просмотр, но он работает не так, как я хотел.

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

он показывает мою ориентацию, которая у меня была в предыдущем представлении. должен ли я что-то добавить в viewdidload, чтобы это заработало? пожалуйста, помогите. Спасибо

Ответ №1:

Это немного взлом, но вот он. В -(void)viewDidLoad ViewController, для которого вы хотите принудительно отобразить портрет, выполните следующее:

 UIViewController *viewController = [[UIViewController alloc] init];
[self presentModalViewController:viewController animated:NO];
[self dismissModalViewControllerAnimated:NO];
[viewController release];
  

Это в основном приводит к портретной ориентации, представляя контроллер (который по умолчанию поддерживает только портретную ориентацию).

Ответ №2:

Вы должны использовать одну ориентацию для всех контроллеров просмотра. В противном случае у вас могут возникнуть некоторые проблемы. Например, в вашем случае представьте, что пользователь переключился на второй вид и изменил ориентацию на UIInterfaceOrientationPortrait. Теперь он возвращается к первому экрану, и все кнопки находятся в неправильных положениях! На самом деле проблема в том, что ориентация не изменится на UIInterfaceOrientationLandscapeRight обратно, как вы ожидаете. Это происходит потому, что shouldAutorotateToInterfaceOrientation не вызывается после запуска viewWillAppear. Итак, вам нужно закодировать несколько грязных хаков, чтобы принудительно изменить ориентацию. Это не очень хорошее решение.

Кстати, как вы меняете свои контроллеры? Если вы используете addSubview, то shouldAutorotateToInterfaceOrientation вашего второго контроллера вообще не будет запускаться. При использовании addSubview вы должны справиться с этим самостоятельно.