Как программно установить ориентацию устройства (UI)? - PullRequest
23 голосов
/ 02 декабря 2010

Хотелось бы, чтобы все на экране (пользовательский интерфейс) могло вращаться с ландшафта влево или вправо или наоборот.

Как мне это сделать? Это личное?

Я знаю, что

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {}

позволяет вам сказать, в каких ориентациях может быть пользовательский интерфейс, но есть ли способ заставить только один за раз?

Приветствия

Ответы [ 10 ]

24 голосов
/ 31 января 2011

В iOS [[UIDevice currentDevice] setDeviceOrientation:UIDeviceOrientationSomeOrientation] метод отсутствует.Но мы можем повернуть представление с помощью строки состояния, для этого:

- (void)showAlbum {
    // check current orientation
    if ([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationLandscapeLeft) {
        // no, the orientation is wrong, we must rotate the UI
        self.navigationController.view.userInteractionEnabled = NO;
        [UIView beginAnimations:@"newAlbum" context:NULL];
        [UIView setAnimationDelegate:self];
        // when rotation is done, we can add new views, because UI orientation is OK
        [UIView setAnimationDidStopSelector:@selector(addAlbum)];
        // setup status bar
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft  animated:NO];
        // rotate main view, in this sample the view of navigation controller is the root view in main window
        [self.navigationController.view setTransform: CGAffineTransformMakeRotation(M_PI / 2)];
        // set size of view
        [self.navigationController.view setFrame:CGRectMake(0, 0, 748, 1024)];
        [UIView commitAnimations];
    } else {
        [self addAlbum];
    }

}
18 голосов
/ 20 июня 2012

У меня был успех с этим:

 if (self.interfaceOrientation != UIInterfaceOrientationPortrait) {
    // /83532/est-li-dokumentirovannyi-sposob-ustanovki-orientatsii-iphone
    // http://openradar.appspot.com/radar?id=697
    // [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; // Using the following code to get around apple's static analysis...
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}
16 голосов
/ 02 декабря 2010

Этот метод вызывается, чтобы определить, должен ли ваш интерфейс автоматически поворачиваться к заданному повороту (т. Е. Позволить UIKit выполнять тяжелую работу, а не делать это вручную).

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

return UIInterfaceOrientationIsLandscape(interfaceOrientation);

Если вы хотите, чтобы ваш пользовательский интерфейс автоматически поворачивался во все ориентации, вы могли бы просто return YES;

Это то, что вы спрашивали?

5 голосов
/ 02 декабря 2010

Если вы представите модальный контроллер вида, который реализует -shouldAutorotateToInterfaceOrientation: для поддержки только одной ориентации, весь интерфейс будет автоматически принудительно введен в него. Я не думаю, что есть способ программно изменить ориентацию в противном случае.

3 голосов
/ 18 марта 2015

В Swift изменить ориентацию на портретную:

UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation")

См .: https://stackoverflow.com/a/24259601

3 голосов
/ 21 июня 2012

Также работает этот простой способ:

[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

и обратно:

[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
2 голосов
/ 15 февраля 2013

На это обратились: Гунтис Треуландс https://stackoverflow.com/a/10146270/894671

//-----------------------------------
// FORCE PORTRAIT CODE
//-----------------------------------
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
//present/dismiss viewcontroller in order to activate rotating.
UIViewController *mVC = [[UIViewController alloc] init];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];
0 голосов
/ 24 июля 2015

Как указано в связанной теме shouldAutorotateToInterfaceOrientation устарело. Новые приложения должны использовать следующие методы, как описано в справочнике по классам UIViewController от Apple , пока они сами не устареют:

  • shouldAutorotate
  • preferredInterfaceOrientationForPresentation; и
  • attemptRotationToDeviceOrientation.

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

0 голосов
/ 07 апреля 2015

Хотя это не простое решение, у меня хорошо работает.

- (void)viewDidLoad
{
   self.view.transform = CGAffineTransformIdentity;
   self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0)); 
   self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
0 голосов
/ 27 августа 2014
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
        objc_msgSend([UIDevice currentDevice], @selector(setOrientation:),    UIInterfaceOrientationLandscapeLeft );
    }
...