iPhone以编程方式设置interfaceorientation

时间:2012-06-19 21:22:52

标签: iphone ios orientation

我正在尝试以编程方式更改单个UIViewController的方向。如果视图是纵向的,用户应在设置中进行选择。该值将保存在NSUserDefaults中,并且在特定ViewController中应更改方向。因此,如果纵向位于interfaceOrientation,则UIInterfaceorientationUpsideDown ......

我使用了以下方法但只会在用户将设备转为横向/纵向时更改方向...否则不会触发任何内容。

- (BOOL)shouldAutoRotateToInterfactOrientation:(UIInterfaceOrientation)interfaceOrientation

此外,我尝试了下一个(也使用方法名称“setOrientation”):

[[UIDevice currentDevice] orientation: UIDeviceOrientationPortraitUpsideDown];

但是再一次,没有任何反应,只是出现错误,因为xcode说没有这个名字的方法。

但是应该是以编程方式改变它的另一种方式...... 第一种方法也只是一种在设备位置之后处理actionListener的方法,但是应该有一种方法可以直接调用这个actionListener .... 我只是查看UIApplication文件,但没有有用的方法....

4 个答案:

答案 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枚举,因此编译器不会显示警告/错误。但它们有不同的含义和"设备"另外有"面朝上"并且"面朝下"取向。