2

我有一个 VC,用户可以在其中拍照或从他们的库中选择一张。

一旦拍摄/选择了照片,它就会传递给UIImageView下一个 VC。

我想只在图像所在的方向上显示这个视图控制器。因此,如果用户在左侧横向拍摄照片(一旦他们选择使用),下一个视图控制器应该在横向左侧加载该图像在UIImageView. 如果他们以纵向方式拍摄图像,则视图控制器以纵向方式加载。一旦 VC 以正确的方向加载,它就不应移动(再旋转)。

这是我迄今为止尝试过的,但无法让它按我的预期工作:

#pragma mark -
#pragma mark - Auto Rotation Overrides
- (BOOL)shouldAutorotate {
    if (self.photoImage != NULL) {
        // Check that photoImage has an image
        if (self.photoImage.imageOrientation == 1 || self.photoImage.imageOrientation == 0) {
            // Landscape left = 0, Landscape rigt = 1
            return YES;
        } else {
            // Portrait normal = 3, portait upside down = 2
            return NO;
        }
    }

    // Fallback to portrait
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    if (self.photoImage != NULL) {
        // Check that photoImage has an image
        if (self.photoImage.imageOrientation == 0) {
            return UIInterfaceOrientationMaskLandscapeLeft;
        } else if (self.photoImage.imageOrientation == 1) {
            return UIInterfaceOrientationMaskLandscapeRight;
        } else {
            return UIInterfaceOrientationMaskPortrait;
        }
    }

    // Fallback to Portrait
    return UIInterfaceOrientationMaskPortrait;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    if (self.photoImage != NULL) {
        // Check that photoImage has an image
        if (self.photoImage.imageOrientation == 0) {
            return UIInterfaceOrientationLandscapeLeft;
        } else if (self.photoImage.imageOrientation == 1) {
            return UIInterfaceOrientationLandscapeRight;
        } else {
            return UIInterfaceOrientationPortrait;
        }
    }

    // Fallback to Portrait
    return UIInterfaceOrientationPortrait;
}

- - -编辑 - - -

shouldAutoRotate设备实际旋转之前不会调用,如何让它在 viewDidLoad 上自动根据图像方向更改方向。我看到该supportInterfaceOrientations方法被调用并且只返回了一个景观,但没有立即移动视图......?

-----编辑2-----

IOS6preferredInterfaceOrientationForPresentation也可以吗?我可以设置我的 Navigation Controller 子类来查看self.topViewControllers preferredInterfaceOrientationForPresentation,但这似乎意味着每个 topViewController 都需要有这个方法。理想情况下,我想将子类设置为:如果 topViewController 对 有响应preferredInterfaceOrientationForPresentation,则使用其他肖像/默认值。这可以做到吗?

如果是这样,我当然可以更新preferredInterfaceOrientationForPresentation哪个会以正确的方向加载该 VC,然后shouldAutoRotate控制它不会被旋转回另一个方向?

4

3 回答 3

0

据我了解,没有办法强制轮换事件,所以你必须提供一些棘手的东西。我在谷歌上搜索“强制 uiview 旋转”,发现一些可能有帮助的链接:

从窗口中删除和重新添加视图

使用变换旋转视图

就个人而言,我会先尝试转换,这是相关代码:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);

我不确定设置状态栏方向是否会改变导航栏的方向,如果您使用的是...

于 2013-07-26T00:04:10.520 回答
0

我过去在这种情况下所做的是为横向和纵向创建单独的视图控制器(例如,我不希望视图自动旋转)。一旦有了单独的视图控制器,您就可以像这样查看 UIImage 的尺寸:

    if(sourceImage.size.width>sourceImage.size.height)
    {
       LandscapeViewController *LandscapeView = [[LandscapeViewController] init];
        [self presentViewController:LandscapeView animated:YES completion:nil];
        NSLog(@"go to Landscape View");
    }
    //Else load into portrait Edit view
    else
    {
        PortraitViewController *PortraitView = [[PortraitViewController alloc] init];
        [self presentViewController:PortraitView animated:YES completion:nil];
        NSLog(@"go to Portrait View");
    }

我确信有更有效的方法,但这非常简单并且有效!

于 2013-07-26T21:38:35.967 回答
0

从 iOS 6 开始,处理方向的是导航控制器。如您所想,您可以将其子类化并检查 topviewcontroller 是否具有所需的选择器respondsToSelector:

- (NSUInteger)supportedInterfaceOrientations {
        if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]){
            return [self.topViewController supportedInterfaceOrientations];
        }
    return [super supportedInterfaceOrientations];
}

我的需要是强制景观。我还在控制器中添加了viewDidLoad

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];

您需要将方向更改为您想要的方向。

于 2013-07-29T08:07:40.510 回答