我正在尝试以编程方式更改单个UIViewController
的方向。如果视图是纵向的,用户应在设置中进行选择。该值将保存在NSUserDefaults
中,并且在特定ViewController
中应更改方向。因此,如果纵向位于interfaceOrientation
,则UIInterfaceorientationUpsideDown
......
我使用了以下方法但只会在用户将设备转为横向/纵向时更改方向...否则不会触发任何内容。
- (BOOL)shouldAutoRotateToInterfactOrientation:(UIInterfaceOrientation)interfaceOrientation
此外,我尝试了下一个(也使用方法名称“setOrientation
”):
[[UIDevice currentDevice] orientation: UIDeviceOrientationPortraitUpsideDown];
但是再一次,没有任何反应,只是出现错误,因为xcode说没有这个名字的方法。
但是应该是以编程方式改变它的另一种方式......
第一种方法也只是一种在设备位置之后处理actionListener的方法,但是应该有一种方法可以直接调用这个actionListener
....
我只是查看UIApplication
文件,但没有有用的方法....
答案 0 :(得分:6)
你应该使用类似这样的代码:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(rotationChanged:)
name:@"UIDeviceOrientationDidChangeNotification"
object:nil];
然后,根据方向更改您的视图:
-(void)rotationChanged:(NSNotification *)notification{
NSInteger orientation = [[UIDevice currentDevice] orientation];
UIWindow *_window = [[[UIApplication sharedApplication] delegate] window];
switch (orientation) {
case 1:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[_window setTransform:CGAffineTransformMakeRotation (0)];
[_window setFrame:CGRectMake(0, 0, 320, 480)];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
[UIView commitAnimations];
break;
case 2:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[_window setTransform:CGAffineTransformMakeRotation (M_PI)];
[_window setFrame:CGRectMake(0, 0, 320, 480)];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
[UIView commitAnimations];
break;
case 3:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[_window setTransform:CGAffineTransformMakeRotation (M_PI / 2)];
[_window setFrame:CGRectMake(0, 0, 320, 480)];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
[UIView commitAnimations];
break;
case 4:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[_window setTransform:CGAffineTransformMakeRotation (- M_PI / 2)];
[_window setFrame:CGRectMake(0, 0, 320, 480)];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:YES];
[UIView commitAnimations];
break;
default:
break;
}
}
希望有所帮助:P
答案 1 :(得分:2)
使用此功能可在iOS7
及更早版本中使用。
[[UIDevice currentDevice] setValue:
[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
forKey:@"orientation"];
答案 2 :(得分:0)
[[UIApplication sharedApplication] setStatusBarOrientation:yourDesiredOrientation];
然后,您需要编辑shouldAutoRotate方法(以下示例适用于肖像:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
答案 3 :(得分:0)
从上一个回答:
[[UIDevice currentDevice] setValue:
[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
forKey:@"orientation"];
警告强>
我没有可能对此答案发表评论,因此我会对其进行编辑。
此答案的作者尝试将UIInterfaceOrientation
类型的值设置为UIDeviceOrientation
的变量。它们都是NSInteger
枚举,因此编译器不会显示警告/错误。但它们有不同的含义和"设备"另外有"面朝上"并且"面朝下"取向。