UIImagePickerController 问题 - iPhone

Posted

技术标签:

【中文标题】UIImagePickerController 问题 - iPhone【英文标题】:UIImagePickerController issue - iPhone 【发布时间】:2014-01-17 05:40:58 【问题描述】:

我使用UIImagePickerControllerportraitlandscape 模式从相机拍摄照片,我的应用程序中允许的方向是portrait & landscape。在纵向模式下,我的相机覆盖工作正常。但是在横向模式下,在拍摄照片后默认相机覆盖标签“预览”并使用和重拍操作按钮,并且从相机拍摄的实时图像也以纵向模式出现。我是否需要使用自动调整大小。如何在横向模式下设置这个完整的相机覆盖视图(第二张截图)?

这是我要提交的代码UIImagePickerController

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO)
    NSLog(@"Camera not available");
    return;


imagePickerController.delegate = self;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:imagePickerController animated:YES completion:nil];

对于方向,这是我使用图像选择器控制器的视图控制器类的代码..

- (BOOL)shouldAutorotate 
    return YES;


- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskPortrait;  

这是我的相机初始视图,当我的设备处于横向模式时:

从相机拍摄照片后的第二次查看:

我的视图控制器,我在其中显示图像选择器仅处于纵向模式,但从相机拍摄照片应该适用于使用图像选择器的纵向和横向。我希望在横向模式下,我的相机叠加层(附加的第二个屏幕截图)应该在视图底部显示他们的预览标签栏。是否可以使用默认相机叠加层或我需要创建自定义相机叠加层视图?请帮我修复它。这是我的应用程序的主要问题。

谢谢。

【问题讨论】:

我也有同样的问题。你是怎么解决这个问题的? 【参考方案1】:

不,你不能用“UIImagePickerController”kindly take a look at documentation来做到这一点。

重要提示:UIImagePickerController 类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给 cameraOverlayView 属性,并使用该视图来显示附加信息或管理相机界面和代码之间的交互。

但您可以使用Assets Library Framework 访问图像列表并创建自己的图像选择器。

你也可以试试 git:ELCImagePickerController。

快乐编码。

【讨论】:

【参考方案2】:

您可以尝试下面的代码来修复您的 Uiimage,您可能需要稍微调整一下才能获得自己的正确方向,

- (void)imagePickerController:(UIImagePickerController *)picker
    didFinishPickingMediaWithInfo:(NSDictionary *)info
 
       UIImage *originalImage = (UIImage*) [info  objectForKey:UIImagePickerControllerOriginalImage];

    //--> get the fixed orientation image
  UIImage *fixedImage = [self fixOrientation:originalImage];


 


- (UIImage *)fixOrientation:(UIImage*)takenImage 
// --> check the correct orientation if yes return the same.
if (takenImage.imageOrientation == UIImageOrientationUp) return takenImage;

// --> if taken image orientation is wrong adjust the image as per the correct orientation.
CGAffineTransform transform = CGAffineTransformIdentity;

switch (takenImage.imageOrientation) 
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, takenImage.size.width, takenImage.size.height);
        transform = CGAffineTransformRotate(transform, M_PI);
        break;

        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        transform = CGAffineTransformTranslate(transform, takenImage.size.width, 0);
        transform = CGAffineTransformRotate(transform, M_PI_2);
        break;

        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, 0, takenImage.size.height);
        transform = CGAffineTransformRotate(transform, -M_PI_2);
        break;
        case UIImageOrientationUp:
        case UIImageOrientationUpMirrored:
        break;


switch (takenImage.imageOrientation) 
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, takenImage.size.width, 0);
        transform = CGAffineTransformScale(transform, -1, 1);
        break;

        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, takenImage.size.height, 0);
        transform = CGAffineTransformScale(transform, -1, 1);
        break;
        case UIImageOrientationUp:
        case UIImageOrientationDown:
        case UIImageOrientationLeft:
        case UIImageOrientationRight:
        break;


//--> draw the calculated image above
CGContextRef ctx = CGBitmapContextCreate(NULL, takenImage.size.width, takenImage.size.height,
                                         CGImageGetBitsPerComponent(takenImage.CGImage), 0,
                                         CGImageGetColorSpace(takenImage.CGImage),
                                         CGImageGetBitmapInfo(takenImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch (takenImage.imageOrientation) 
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:

        CGContextDrawImage(ctx, CGRectMake(0,0,takenImage.size.height,takenImage.size.width), takenImage.CGImage);
        break;

    default:
        CGContextDrawImage(ctx, CGRectMake(0,0,takenImage.size.width,takenImage.size.height), takenImage.CGImage);
        break;


// return the new fixed image to display
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;

您可以调整代码以获得所需的方向。

【讨论】:

@spiderThanks,我已经使用了你上面的代码,但我的问题还是一样。我希望我附加的第二个屏幕截图是横向而不是纵向。 是否可以跳过第二个屏幕截图,我的意思是说当用户点击第一个屏幕截图的相机按钮时,它将关闭选择器视图(用于跳过第二个屏幕截图)并调用 didFinishPickingMediaWithInfo 方法。 .? 上面的代码做同样的事情,它改变了你点击的图像的方向,但默认情况下你想要什么图像方向,我最后评论说你必须调整上面的代码很少,其余的基本是一样的,因为 UIimagecontroller @iLearner 是正确的,你不能把它放在横向模式,但你可以改变你的图像方向以正确显示

以上是关于UIImagePickerController 问题 - iPhone的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 不会取消,收到有关分离的 ViewControllers 的消息

SVG 覆盖在 UIImagePickerController 之上,UIImagePickerController 响应手势(iPhone/iOS)

UIImagePickerController 不是全屏

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController