Je crée une application iPad qui a plusieurs photos (UIImageViews
) dans une vue de défilement horizontale. Je veux permettre à l'utilisateur d'enregistrer les images dans sa photothèque lorsqu'il appuie sur l'un des UIImageView
s. J'aime la manière dont Safari gère ce problème: il suffit de taper et de maintenir enfoncé jusqu'à ce qu'un menu contextuel apparaisse, puis de cliquer sur enregistrer l'image. Je sais qu'il y a le "UIImageWriteToSavedPhotosAlbum
". Mais je suis un débutant pour le développement iOS et je ne suis pas trop sûr de savoir où aller avec et où le mettre (c'est-à-dire comment détecter quelle image a été tapée). D'après ce que j'ai trouvé, j'ai vu que les gens utilisent UIImage
au lieu de UIImageView
. Dois-je convertir ma vue en UIImage
? Si c'est le cas, comment? Comment puis-je détecter lorsque l'utilisateur appuie sur les images et sur lequel a été tapé? Si vous pouviez me diriger dans la bonne direction, et peut-être quelques exemples, je l'apprécierais grandement.Enregistrer l'image dans UIImageView to iPad Photos Library
7
A
Répondre
32
Vous pouvez utiliser la propriété image
d'un UIImageView
pour obtenir l'image actuelle:
UIImage* imageToSave = [imageView image]; // alternatively, imageView.image
// Save it to the camera roll/saved photo album
UIImageWriteToSavedPhotosAlbum(imageToSave, nil, nil, nil);
3
En ce qui concerne la partie de votre question demandant comment détecter ce qui UIImageView a été exploité, vous pouvez utiliser le code comme ce qui suit :
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint touchEndpoint = [touch locationInView:self.view];
CGPoint imageEndpoint = [touch locationInView:imageview];
if(CGRectContainsPoint([imageview frame], touchEndpoint))
{
do here any thing after touch the event.
}
}
4
- (IBAction)TakePicture:(id)sender {
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
// Delegate is self
imagePicker.delegate = self;
OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGTH)];
// imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y);
// Insert the overlay:
imagePicker.cameraOverlayView = overlay;
// Allow editing of image ?
imagePicker.allowsImageEditing = YES;
[imagePicker setCameraDevice:
UIImagePickerControllerCameraDeviceFront];
[imagePicker setAllowsEditing:YES];
imagePicker.showsCameraControls=YES;
imagePicker.navigationBarHidden=YES;
imagePicker.toolbarHidden=YES;
imagePicker.wantsFullScreenLayout=YES;
self.library = [[ALAssetsLibrary alloc] init];
// Show image picker
[self presentModalViewController:imagePicker animated:YES];
}
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// Access the uncropped image from info dictionary
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// Save image to album
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
// save image to custom album
[self.library saveImage:image toAlbum:@"custom name" withCompletionBlock:^(NSError *error) {
if (error!=nil) {
NSLog(@"Big error: %@", [error description]);
}
}];
[picker dismissModalViewControllerAnimated:NO];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
UIAlertView *alert;
// Unable to save the image
if (error)
alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Unable to save image to Photo Album."
delegate:self cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
else // All is well
alert = [[UIAlertView alloc] initWithTitle:@"Success"
message:@"Image saved to Photo Album."
delegate:self cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex
{
// After saving iamge, dismiss camera
[self dismissModalViewControllerAnimated:YES];
}
1
En Swift:
// Save it to the camera roll/saved photo album
// UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, nil, nil, nil) or
UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, self, "image:didFinishSavingWithError:contextInfo:", nil)
func image(image: UIImage!, didFinishSavingWithError error: NSError!, contextInfo: AnyObject!) {
if (error != nil) {
// Something wrong happened.
} else {
// Everything is alright.
}
}
Merci pour la réponse rapide. Mais comment puis-je détecter quel UIImageView a été tapoté? Y at-il un moyen de faire apparaître un pop-up lorsque l'utilisateur appuie sur l'image qui permet à l'utilisateur de sélectionner un bouton pour enregistrer? Et quand le bouton "Enregistrer" est pressé, je voudrais mettre votre déclaration dans cette IBAction, non? – Brian
Vous pouvez câbler l'événement 'retoucher à l'intérieur' sur votre UIImageView dans Interface Builder à une méthode d'action que vous implémentez (ceci peut également être fait par programme), comme '- (void) touchedImageView: (id) sender', auquel cas «expéditeur» serait la vue qui a été touchée. À partir de là, vous pouvez présenter un menu (comme une «UIActionSheet») pour décider de sauvegarder l'image. – bosmacs
J'ai le code en bas, mais je ne vois aucun des événements 'touch' dans Interface Builder. Avec l'un de mes UIImageViews sélectionné, je vais à la fenêtre Inspecteur, puis l'onglet Connexions, non? Je vois les événements tactiles quand un bouton est sélectionné mais pas un UIImageView. Est-ce que je devrais juste faire tous ces UIImageViews dans des boutons? – Brian