UIImagePickerController 问题 - iPhone
Posted
技术标签:
【中文标题】UIImagePickerController 问题 - iPhone【英文标题】:UIImagePickerController issue - iPhone 【发布时间】:2014-01-17 05:40:58 【问题描述】:我使用UIImagePickerController
以portrait
和landscape
模式从相机拍摄照片,我的应用程序中允许的方向是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)