iOS 7中弹出窗口内的图像选择器行为错误

23

我的图像选择器视图控制器设置在弹出控制器中。在iOS 6上一切都很好,但是在iOS 7上图像会旋转,并且所有移动都相反:当将iPad向左转时,图像向下移动,向上移动时图像向左移动,等等。

这是显示我的相机的代码:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;

    objPopView = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
    [objPopView presentPopoverFromRect:CGRectMake(842, 163, 0, 0)
                                inView:self.view
              permittedArrowDirections:UIPopoverArrowDirectionRight
                              animated:YES];

我的应用程序仅使用横向模式,现在图像被旋转了: 输入图像描述

3个回答

17
根据 苹果官方文档,它说:
呈现用户界面。在 iPhone 或 iPod touch 上,通过调用当前活动视图控制器的 presentViewController:animated:completion: 方法,将配置的图像选择器控制器作为新视图控制器传递来全屏显示。
在 iPad 上,正确呈现图片选择器的方式取决于其来源类型,如下表所述:
  • 相机照片:使用全屏
  • 库已保存:必须使用弹出窗口
  • 照片集:必须使用弹出窗口
  • 在 iPad 上,如果指定 UIImagePickerControllerSourceTypeCamera 的源类型,则可以通过模态(全屏)或使用弹出窗口来呈现图像选择器。然而,苹果建议仅使用全屏呈现相机接口。
    虽然它说了“可以通过模态(全屏)或使用弹出窗口来呈现图像选择器”,但是通过使用弹出窗口会导致奇怪的问题。我猜这可能是 iOS 7 SDK 的一个错误。
    我仍在尝试解决此问题,但目前唯一的办法就是以模态方式显示它。
    -presentViewController:animated:completion:
    

    这种方法是全屏模式(实际上,我不喜欢这种方式)。

    此外,在苹果的开发者论坛中有一个讨论它的帖子,你可以看一下。 ;)


    有解决这个问题的方法吗?有人知道吗? - Tarun
    @Tarun 还没有,我只是选择了全屏显示来解决这个问题。当我有更好的解决方案时,我会更新这个答案。 :) - Kjuly
    为什么不使用 AvFoundation 而使用 UIImagePicker? - Vidhyanand
    @Vidhyanand 抱歉,为什么?就像你所看到的,“AV Foundation 是多个框架之一,可用于播放和创建基于时间的音视频媒体。它提供了一个 Objective-C 接口,您可以使用该接口在详细级别上处理基于时间的音视频数据。” - Kjuly
    谢谢提供信息。我想我必须使用全屏来使用摄像头,对我来说没有太多选择。我已经尝试了所有方法。 - Emmy
    @Emmy 不用谢。是的,目前来看,通过相机进行全屏拍照似乎是最好的选择 :) - Kjuly

    6

    请尝试以下操作:

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    
    CGFloat scaleFactor=1.3f;
    
    switch ([UIApplication sharedApplication].statusBarOrientation) {
    
        case UIInterfaceOrientationLandscapeLeft:
    
            imagePicker.cameraViewTransform = CGAffineTransformScale(CGAffineTransformMakeRotation(M_PI * 90 / 180.0), scaleFactor, scaleFactor);
    
            break;
    
        case UIInterfaceOrientationLandscapeRight:
    
            imagePicker.cameraViewTransform = CGAffineTransformScale(CGAffineTransformMakeRotation(M_PI * -90 / 180.0), scaleFactor, scaleFactor);
    
            break;
    
        case UIInterfaceOrientationPortraitUpsideDown:
    
            imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(M_PI * 180 / 180.0);
    
            break;
    
            default:
                break;
        }
    
    objPopView = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
    [objPopView presentPopoverFromRect:CGRectMake(842, 163, 0, 0)
                                inView:self.view
              permittedArrowDirections:UIPopoverArrowDirectionRight
                              animated:YES];
    

    感谢 https://dev59.com/Z2Mk5IYBdhLWcg3wxAlM#19071958 的贡献。


    0

    在iOS7中正常工作的唯一方法是使用

    -presentViewController:animated:completion:

    您可以尝试通过cameraViewTransform属性更改相机视图变换,但结果会很丑陋。将视图添加到自定义ViewController(旋转到横向)也会产生丑陋的结果。我开始讨厌这个操作系统版本。


    没有起作用。而且,不能采取一种变换式的黑客手段。 - Tarun

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接