iPhone SDK: Ориентация (альбомная и книжная ориентация) - PullRequest
9 голосов
/ 10 января 2009

Хорошо, у меня есть обычное приложение в портретном режиме. Я могу заставить мое приложение перейти в альбомный режим для представления (с помощью navigationcontroller и viewcontroller) следующим образом:

- (void)viewWillAppear:(BOOL)animated {
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
}

Но потом, когда я возвращаюсь в главное меню (просмотр таблицы), он возвращается прямо к портрету. Я пытаюсь этот код:

- (void)viewWillAppear:(BOOL)animated {
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
}

Но это не работает ..

Есть идеи?

Ответы [ 5 ]

9 голосов
/ 04 апреля 2010

Обратите внимание на функцию shouldAutorotateToInterfaceOrientation: в классе UIViewController. Эта функция возвращает YES, если ориентации поддерживаются вашим UIView. Если вы вернете ДА только в альбомную ориентацию, iPhone будет автоматически переведен в эту ориентацию.

Следующий код должен это сделать. Поместите его в UIViewController, который управляет видом, который вы хотите поместить в ландшафтный режим.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscape);
}
7 голосов
/ 11 января 2009

Чтобы заставить это работать, я добавил это к контроллеру rootview:

- (void)viewWillAppear:(BOOL)animated {
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

}

Кажется, сейчас это работает.

3 голосов
/ 21 января 2009

Вот что я делаю, чтобы сделать это:

сначала поместите это определение вверху вашего файла, прямо под #imports:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

затем в viewWillAppear: метод

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

Если вы хотите, чтобы это было анимировано, тогда вы можете обернуть все это в блок анимации, например, так:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

Затем в контроллере портретного режима вы можете сделать обратное - проверить, находится ли он в настоящее время в альбомной ориентации, и, если да, повернуть его обратно в книжный режим.

0 голосов
/ 12 сентября 2010

Вы не можете использовать этот приватный API.

Для этого есть решение: использовать контроллер представления и добавить его представление в окно. затем в этом контроллере вы заставляете ландшафт в методе beforeAutorotate .... Он работает нормально, но убедитесь, что это необходимо для вашего проекта, потому что не очень разумно заставлять пользователя поворачивать свой iPhone. Кстати, вот пример кода, если он вам нужен.

http://www.geckogeek.fr/iphone-forcer-le-mode-landscape-ou-portrait-en-cours-dexecution.html

0 голосов
/ 10 января 2009

Вам необходимо отредактировать файл Info.plist, чтобы добавить ключ UIInterfaceOrientation с соответствующим значением (UIInterfaceOrientationLandscapeRight или UIInterfaceOrientationLandscapeLeft).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...