Иногда UIImageView, кажется, отклоняет изображение, снятое с помощью камеры iPhone - PullRequest
2 голосов
/ 04 марта 2010

это очень странно, потому что эта ошибка не происходит постоянно ...

У меня есть следующий код:

- (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 UIImagePNGRпредставление (изображение)
сразу после setImage и вставил вывод в файл. Файл является идеальным PNG.

Кто-нибудь испытывал то же самое? Кто-нибудь нашел решение для этого?

Заранее спасибо

Макс

Ответы [ 4 ]

3 голосов
/ 04 марта 2010

Звучит так, будто вам не хватает памяти.

Я думаю, что вы должны выпустить UIImagePickerController после вывода его на экран с presentModalViewController:.

(Он будет сохранен для вас контроллером представления, который представляет его)

1 голос
/ 12 июня 2010

У меня была эта проблема даже на 3GS. Но я мог бы решить эту проблему, выпустив UIImagePickerViewController перед установкой imageView.image Я думаю, это освободило пару байтов. Может быть, эта информация поможет.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
 [self dismissModalViewControllerAnimated:YES];
 [picker release];
 UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
 imageView.image = image;
}
1 голос
/ 10 апреля 2010

Да, это решение, которое сработало для меня.Использование didreceivememorywarning для хранения всех текстовых полей и данных изображения на телефон.На pickerdidfinish я также сохраняю изображение на телефон.Onload Я проверяю, существует ли это имя файла изображения в телефоне, если это так, загрузите его.По сути, операционная система iPhone закрывает ваше приложение и открывает его снова.Поместите NSLog в viewDidLoad, и вы заметите, что он вызывается в процессе получения изображения.Этот метод должен вызываться только один раз.Если он снова вызывается, значит, ваше приложение умерло и перезапущено.Это проблема памяти.Не хватает лошадиных сил.Я не вижу эту проблему на iPhone 3GS

1 голос
/ 06 марта 2010

Решение:

Сразу после съемки система вызывает полученное предупреждение в памяти контроллера. Но сам контроллер остается сохраненным. При нажатии используется селектор делегата и устанавливается изображение в imageView. Но после отклонения модального представления система повторно инициализирует представление из пера. Таким образом, изображение из кончика перезаписывает изображение, установленное в селекторе делегатов. Решение состоит в том, чтобы сохранить содержимое всех текстовых полей и представлений в didReceiveMemoryWarning в словаре, сохранить изображение в переменной экземпляра и сбросить его в viewDidLoad, если они присутствуют.

...