2010-03-03 8 views
2

il est très étrange, parce que cette erreur ne se produit pas tout le temps ...UIImageView semble rejeter l'image prise avec l'iPhone caméra

je le code suivant:

- (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]; 
} 

avec le sélecteur délégué correspondant

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [[info objectForKey:@"UIImagePickerControllerOriginalImage"] imageByScalingToSize:CGSizeMake(480, 320)]; 
    [[self imageView] setImage:image]; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

chose étrange est, parfois l'image apparaît dans imageView et parfois non. Je l'ai appelé
(gdb) po UIImagePNGRepresentation (image)
juste après setImage et farcie la sortie dans un fichier. Le fichier est un png parfait.

Quelqu'un at-il vécu la même chose? Quelqu'un at-il trouvé une solution pour cela?

Merci à l'avance

Max

+0

Pour le rendre un peu plus étrange. Dans la fenêtre du débogueur, j'ai vérifié le pointeur dans _storage de imageView et il est passé de 0x0 comme prévu au nouveau pointeur, le même pointeur que j'ai vu pour l'image. C'est vraiment bizarre. – maxbareis

+0

J'ai ajouté une propriété pour l'image et stocker l'image dans la propriété. J'ai mis un point d'arrêt dans un IBAction différent, effectué l'action et dans la fenêtre du débogueur je peux voir, que l'image pointe toujours vers l'adresse mémoire identique.po la représentation png me donne les données de la bonne image. Semble être quelque chose avec UIImageView (le _storage pointe vers 0x0 juste après l'exécution de la deuxième IBAction) – maxbareis

+0

J'ai défini un point d'arrêt sur viewDidLoad et le sélecteur a été effectué lors de l'utilisation du périphérique. Dans Simulator, le sélecteur n'est pas appelé. Étrange. – maxbareis

Répondre

3

On dirait que vous êtes à court de mémoire.

Je pense que vous êtes censé libérer le UIImagePickerController après l'avoir mis à l'écran avec presentModalViewController:.

(Il sera pour vous être retenu par le contrôleur de vue qui le présente)

+0

Vous avez raison, la libération devrait être là, mais ce n'est pas la solution. Cela ne fonctionne toujours pas. Et comme dit précédemment, l'image est là, je peux po les Données de la Représentation PNG, la stocker dans un fichier et c'est un vrai fichier png. Et je ne reçois aucune "erreur de mémoire" ou exception. L'image n'est simplement pas présentée. – maxbareis

+0

Je ne reçois pas non plus "d'erreur de mémoire". Mais libérer le sélecteur avant de définir une image pour UIImageView fonctionne pour moi. – Tanin

1

La solution est:

Juste après avoir pris la photo du receivedMemoryWarning dans le contrôleur est appelé par le système. Mais le contrôleur lui-même reste retenu. Lorsque vous appuyez sur, le sélecteur délégué est exécuté et l'image dans imageView est définie. Mais après avoir rejeté la vue modale, le système réinitialise la vue de la plume. Ainsi, l'image de la plume écrase l'image définie dans le sélecteur de délégué. La solution est de stocker le contenu de tous les champs de texte et des vues dans didReceiveMemoryWarning dans un dictionnaire, et stocker l'image dans une variable d'instance et les remettre à zéro en viewDidLoad si elles sont présentes.

1

Oui, c'est la solution qui a fonctionné pour moi. Utiliser didreceivememorywarning pour stocker toutes les données textfield et uiimage sur le téléphone. Sur pickerdidfinish, je sauvegarde également l'image sur le téléphone. Onload Je vérifie si ce nom de fichier d'image existe dans le téléphone, si c'est le cas, chargez-le. Fondamentalement, l'iPhone OS ferme votre application et le reopennkng. Mettez un peu de NSLog dans viewDidLoad et vous remarquerez qu'il est appelé pendant le processus de prise d'image. Cette méthode est seulement supposée être appelée une fois. Si elle est appelée à nouveau, cela signifie que votre application est morte et redémarrée. C'est un problème de mémoire. Pas assez de puissance de cheval. Je ne vois pas ce problème sur l'iPhone 3GS

1

J'ai eu ce problème même sur le 3GS. Mais je pouvais résoudre, en libérant le UIImagePickerViewController avant le réglage de la imageView.image Je suppose que cela a libéré quelques octets. Peut-être que cette info aide.

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