有时UIImageView似乎拒绝使用iPhone Camera拍摄的图像

时间:2010-03-03 21:17:43

标签: iphone uiimageview uiimage camera

这很奇怪,因为这个错误不会一直发生......

我有以下代码:

- (IBAction)getPhoto:(id)sender {
  UIImagePickerController * picker = [[UIImagePickerController alloc] init];
  picker.delegate = self;   
#if TARGET_IPHONE_SIMULATOR
  picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;    
#else   
  picker.sourceType = UIImagePickerControllerSourceTypeCamera;  
#endif
  [self presentModalViewController:picker animated:YES];
}

使用相应的委托选择器

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  UIImage *image = [[info objectForKey:@"UIImagePickerControllerOriginalImage"] imageByScalingToSize:CGSizeMake(480, 320)];
  [[self imageView] setImage:image];
  [picker dismissModalViewControllerAnimated:YES];
}
奇怪的是,有时图像出现在imageView中,有时则不然。我叫过 (gdb)po UIImagePNGRepresentation(image)
在setImage之后,将输出填充到文件中。该文件是一个完美的png。

有没有人经历过同样的事?有人找到了解决方案吗?

提前致谢

最高

4 个答案:

答案 0 :(得分:3)

听起来你的内存不足。

我认为您应该在UIImagePickerController将其放在屏幕上后发布presentModalViewController:

(它将由呈现它的视图控制器保留给你)

答案 1 :(得分:1)

解决方案是:

在拍摄照片后,系统会调用控制器中的receivedMemoryWarning。但控制器本身仍保留。按下使用时,将执行委托选择器并设置imageView中的图像。但在解除模态视图后,系统会从笔尖重新初始化视图。因此,来自nib的图像会覆盖委托选择器中的图像集。 解决方案是将所有文本字段和视图的内容存储在字典中的didReceiveMemoryWarning中,并将图像存储在实例变量中,并在viewDidLoad中重置它们(如果它们存在)。

答案 2 :(得分:1)

是的,这是适合我的解决方案。使用didreceivememorywarning将所有textfield和uiimage数据存储到手机中。在pickerdidfinish我也将图像保存到手机。 Onload我检查手机中是否存在该图像文件名,如果是,则加载它。基本上iPhone OS正在关闭你的应用程序并重新打开它。在viewDidLoad中放入一些NSLog,你会发现在图像获取过程中会调用它。该方法只能被调用一次。如果再次调用则表示您的应用程序已经死亡并重新启动。这是一个记忆问题。没有足够的马力。我没有在iPhone 3GS上看到这个问题

答案 3 :(得分:1)

即使在3GS上我也遇到了这个问题。但我可以通过在设置imageView.image之前释放UIImagePickerViewController 来解决它 我猜这释放了几个字节。也许这个信息有帮助。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
 [self dismissModalViewControllerAnimated:YES];
 [picker release];
 UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
 imageView.image = image;
}