代码之家  ›  专栏  ›  技术社区  ›  maxbareis

有时,uiimageview似乎会拒绝使用iphone相机拍摄的图像

  •  2
  • maxbareis  · 技术社区  · 14 年前

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

    我有以下代码:

    - (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(图片)
    就在setimage之后,并将输出填充到一个文件中。这个文件是一个完美的png。

    有没有人有同样的经历?有人找到解决办法了吗?

    提前谢谢

    马克斯

    4 回复  |  直到 14 年前
        1
  •  3
  •   Stefan Arentz    14 年前

    听起来你的记忆快用完了。

    我想你应该释放 UIImagePickerController 把它放在屏幕上之后 presentModalViewController:

    (它将由呈现它的视图控制器为您保留)

        2
  •  1
  •   maxbareis    14 年前

    解决办法是:

    拍摄完照片后,系统立即调用控制器中的ReceivedMemoryWarning。但控制器本身仍然保留。按Use时,将执行委托选择器并设置ImageView中的图像。但是在解除模式视图之后,系统会从nib重新初始化视图。因此,nib中的图像将覆盖委托选择器中的图像集。 解决方案是将所有文本字段和视图的内容存储在字典中的didReceiveMemoryWarning中,并将图像存储在实例变量中,如果它们存在,则在viewDidLoad中重置它们。

        3
  •  1
  •   Al.    14 年前

    是的,这就是我的解决办法。使用DidReceiveMemoryWarning将所有文本字段和uiImage数据存储到手机中。在pickeridfinish上,我还将图像保存到电话中。onload我检查该图像文件名是否存在于手机中,如果存在,请加载它。基本上,iphone操作系统正在关闭你的应用程序并重新打开它。在viewdidload中放置一些nslog,您会注意到在图像拍摄过程中调用了它。那个方法应该只被调用一次。如果再次调用它,则意味着应用程序死机并重新启动。这是一个记忆问题。马力不够。我在iPhone3GS上看不到这个问题

        4
  •  1
  •   Michael    14 年前

    即使在3GS上我也有这个问题。但我可以通过释放uiimagepickerviewcontroller来解决这个问题 之前 设置imageview.image 我想这释放了几个字节。也许这些信息有帮助。

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