首页 文章

UIImagePickerController问题 - iPhone

提问于
浏览
0

我正在使用 UIImagePickerController 从相机中以 portraitlandscape 模式捕捉照片,我的应用中的允许方向是 portrait & landscape . 在纵向模式下,我的相机叠加工作正常 . 但是对于横向模式,在捕获照片默认相机覆盖标签"Preview"并使用&重拍动作按钮后,从相机捕获的实时图像也将进入纵向模式 . 我是否需要使用自动调整大小 . 如何在横向模式下设置完整的相机叠加视图(第2个屏幕截图)?

这是我的代码 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;  
}

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

enter image description here

从相机捕获照片后的第二个视图:

enter image description here

我的视图控制器,我在显示图像选择器只在纵向模式,但从相机捕获照片应该使用图像选择器工作肖像和风景 . 我希望在横向模式下,我的相机覆盖(附加的第二个屏幕截图)应该在视图的底部显示它们的预览标签栏 . 是否可以使用默认相机覆盖或我需要创建自定义相机覆盖视图?请帮我修理一下 . 这是我的应用程序中的主要问题 .

谢谢 .

2 回答

  • 0

    不,你不能用"UIImagePickerController " kindly take a look at documentation做到这一点 .

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

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

    你也可以尝试一下git:ELCImagePickerController .

    快乐的编码 .

  • 0

    您可以尝试下面的代码来修复您的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;
    }
    

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

相关问题