2010-11-16 8 views
7

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

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); 
+0

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

+0

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

+0

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

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. 
      } 
    } 
Questions connexes