2

我正在尝试以UIViewController编程方式更改单个的方向。用户应该在设置中选择视图是否为纵向。该值将被保存在NSUserDefaults特定ViewController的方向应该改变。所以如果肖像是在interfaceOrientation应该是UIInterfaceorientationUpsideDown......

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

- (BOOL)shouldAutoRotateToInterfactOrientation:(UIInterfaceOrientation)interfaceOrientation

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

[[UIDevice currentDevice] orientation: UIDeviceOrientationPortraitUpsideDown];

但同样,什么也没发生,只是出现错误,因为 xcode 说没有具有此名称的方法。

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

4

4 回答 4

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

于 2012-06-20T00:10:27.577 回答
2

iOS7在更早的时候使用它可以完美地工作。

[[UIDevice currentDevice] setValue:
           [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                            forKey:@"orientation"];
于 2014-08-27T12:32:38.413 回答
0
[[UIApplication sharedApplication] setStatusBarOrientation:yourDesiredOrientation];

然后您将需要编辑 shouldAutoRotate 方法(以下示例用于纵向:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
于 2012-06-19T21:27:36.060 回答
0

从以前的答案:

[[UIDevice currentDevice] setValue:
           [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                            forKey:@"orientation"];

警告

我无法评论这个答案,所以我会编辑它。

这个答案的作者试图将一个UIInterfaceOrientation类型的值设置为一个变量UIDeviceOrientation。它们都是NSInteger枚举,因此编译器不会显示警告/错误。但它们有不同的含义,“设备”还有“面朝上”和“面朝下”两种方向。

于 2015-03-05T07:30:04.047 回答