Как программно настроить ориентацию устройства (UI)?
Хотелось бы, чтобы все на экране (UI) могло поворачиваться с пейзажа слева направо или наоборот.
Как мне это сделать? Это личное?
Я знаю, что
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {}
позволяет вам сказать, какие ориентации пользовательский интерфейс может быть, но есть ли способ заставить только один за раз?
Приветствия
Ответы
Ответ 1
Этот метод вызывается, чтобы определить, должен ли ваш интерфейс автоматически вращаться до заданного вращения (т.е. позволяя UIKit выполнять тяжелую работу, а не выполнять ее вручную).
Итак, если вы хотите, чтобы ваше приложение работало только в ландшафте, вы должны реализовать тело этого метода с помощью
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
Если вы хотите, чтобы ваш пользовательский интерфейс автоматически вращался во всех направлениях, вы могли бы просто
return YES;
Это то, о чем вы спрашивали?
Ответ 2
В 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];
}
}
Ответ 3
У меня был успех с этим:
if (self.interfaceOrientation != UIInterfaceOrientationPortrait) {
// http://stackoverflow.com/questions/181780/is-there-a-documented-way-to-set-the-iphone-orientation
// http://openradar.appspot.com/radar?id=697
// [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; // Using the following code to get around apple static analysis...
[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}
Ответ 4
Если вы представляете контроллер модального представления, который реализует -shouldAutorotateToInterfaceOrientation:
только для поддержки одной ориентации, весь интерфейс будет автоматически принудительно включен в нее. Я не думаю, что есть способ программно изменить ориентацию в противном случае.
Ответ 5
Также этот простой способ работает:
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
и обратно:
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
Ответ 6
В Swift изменить ориентацию на портрет:
UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation")
Смотрите: fooobar.com/questions/97851/...
Ответ 7
Это рассмотрели: Guntis Treulands fooobar.com/questions/97844/...
//-----------------------------------
// 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];
Ответ 8
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft );
}
Ответ 9
Несмотря на то, что это не простаивающее решение, хорошо работает для меня.
- (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);
}
Ответ 10
Как предложенный в соответствующем потоке shouldAutorotateToInterfaceOrientation
устарел. Новые приложения должны использовать следующие методы, описанные в Apple Справочник класса UIViewController, пока они сами не станут устаревшими:
-
shouldAutorotate
,
-
preferredInterfaceOrientationForPresentation
; и
-
attemptRotationToDeviceOrientation
.
Из того, что я понимаю, лучше всего использовать разные View Controllers для представлений, которые необходимо заблокировать (то есть иметь предпочтительный) режим ориентации, который отличается от последнего.