UIImagePickerController强制其他视图中的图像全尺寸显示。

7
在我的应用程序中,有一个地方需要使用相机,所以我调用了UIImagePickerController。不幸的是,一旦我从控制器返回,大部分图片都是全尺寸显示,而不管它们的UIImageView属性如何。例外情况似乎是在UITableViewCell中的UIImageView。这适用于应用程序中的所有视图,而不仅仅是直接连接到调用UIImagePickerController的视图控制器的视图。有一次我在研究解决问题时,问题似乎自己消失了,但是我无法复制这个过程。
代码如下。
-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                           message:@"Device has no camera"
                                                           delegate:nil
                                                           cancelButtonTitle:@"OK"
                                                           otherButtonTitles:nil];
        [errorAlertView show];
        [_app.navController popPage];
    }
    else if(firstTime){
        UIImagePickerController *picker = [[UIImagePickerController  alloc] init];
        picker.delegate = self;
        picker.allowsEditing = YES;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;

        firstTime = false;

        [self presentViewController:picker animated:YES completion:NULL];
    }
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *cameraImage = info[UIImagePickerControllerEditedImage];
    [picker dismissViewControllerAnimated:YES completion:NULL];

    NSString *folderName = @"redApp";
    if([_page hasChild:[RWPAGE FOLDER]]){
        folderName = [_page getStringFromNode:[RWPAGE FOLDER]];
    }

    NSDate *datetimeNow = [[NSDate alloc] init];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss-SSS"];
    NSString *filename = [NSString stringWithFormat:@"%@.png",[dateFormatter stringFromDate:datetimeNow]];

    NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *folderPath = [applicationDocumentsDir stringByAppendingPathComponent:folderName];
    NSString *filePath = [folderPath stringByAppendingPathComponent:filename];

    NSError *error = nil;
    if(![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:nil]){
        [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:NO
                                                        attributes:nil error:&error];
    }

    if(error != nil){
        NSLog(@"Create directory error: %@", error);
    }

    [UIImagePNGRepresentation(cameraImage) writeToFile:filePath options:NSDataWritingAtomic error:&error];

    if(error != nil){
        NSLog(@"Error in saving image to disk. Error : %@", error);
    }

    RWXmlNode *nextPage = [_xml getPage:[_page getStringFromNode:[RWPAGE CHILD]]];
    nextPage = [nextPage deepClone];
    [nextPage addNodeWithName:[RWPAGE FILEPATH] value:filePath];

    [_app.navController pushViewWithPage:nextPage];
}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:NULL];

    [_app.navController popPage];
}
编辑: 进一步说明如下。
该应用程序的基础是自定义容器视图控制器,类似于导航控制器。当用户导航到页面(我称其为视图和视图控制器的组合)时,它会显示在自定义容器视图上,并将上一页存储在堆栈中。
我的某个页面调用了UIImagePicker。一旦图像选择器关闭并且我返回应用程序时,在打开新页面时整个应用程序出现问题。我并不是在每页都看到问题,但它们存在于多个独立页面上。大多数页面看起来完全没有受到影响,而有问题的页面似乎没有遵守其限制。

如果你想要重新调整图像的大小,请按照此链接 - Nithin Michael
我不是很理解你的问题。但是你尝试使用[UIImageView setContentMode:UIViewContentModeScaleAspectFill]了吗?如果我理解正确,你有一个在xib中的UIImageView,并且即使它有一定的大小,当你打开图像时,它也会以全屏模式打开?而不使用UIImageView的框架大小?如果是这样,请尝试使用UIImageView的内容模式,并检查它是否未自动调整大小。 - artud2000
我的应用有多个不同的页面/视图,每个都有自己的xib和视图控制器。这个问题遍布整个应用程序。在xib中,所有图片都设置了它们的contentmode(大多数为Aspect Fill),并且在调用UIImagePicker之前正常工作。我刚刚在其中一个视图的viewWillAppear中设置了contentmode,现在图像大小正确,但其余部分的视图出现问题,我的标题TextView已经消失在屏幕上,我的body TextView超出了两侧。可能是约束有问题,或者父视图的大小有问题。 - Rubberduck
2个回答

3

如果您想压缩图像,请使用以下方法

+(UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize
{
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = image.CGImage;

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

// Set the quality level to use when rescaling
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height);

CGContextConcatCTM(context, flipVertical);
// Draw into the context; this scales the image
CGContextDrawImage(context, newRect, imageRef);

// Get the resized image from the context and a UIImage
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

CGImageRelease(newImageRef);
UIGraphicsEndImageContext();

return newImage;
}

或者+(UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize { 该函数用于将图片缩放到指定大小。
CGFloat scaleFactor = 1.0;


if (image.size.width > targetSize.width || image.size.height > targetSize.height)
    if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
        scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.

UIGraphicsBeginImageContext(targetSize);


CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
                         (targetSize.height -  image.size.height * scaleFactor) / 2,
                         image.size.width * scaleFactor, image.size.height * scaleFactor);


[image drawInRect:rect];


UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return scaledImage;
}

3
尝试像这样:-
    UIImage *thumbnail =[UIImage imageNamed:@"yourimage.png"];
    CGSize itemSize = CGSizeMake(35, 35);
    UIGraphicsBeginImageContext(itemSize);
    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    [thumbnail drawInRect:imageRect];
   // Now this below image contains compressed image
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

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