web-dev-qa-db-fra.com

Sélectionner plusieurs images dans la photothèque

Je vais poser cette question qui a peut-être déjà été posée un million de fois.

Je crée une application pour iPad et je veux donner aux utilisateurs la possibilité de sélectionner plusieurs images à partir de leur photothèque. J'ai déjà un code de travail permettant à l'utilisateur de sélectionner une image à la fois. (pas ce dont j'ai besoin)

J'ai déjà téléchargé et examiné un exemple de code de sélecteur d'images ELC, mais ce code n'est pas compatible avec iOS 5 ou Xcode 4. C'est-à-dire qu'il a ARC et compile des problèmes à gauche et à droite, son utilisation libère et désalloue partout.

Je suis simplement frustré que Apple n'ait pas déjà créé une API intégrée pour les développeurs pour cette fonctionnalité la plus demandée dans la plupart de nos applications iPhone/iPad. (Pas une mais multi-sélection photos)

Existe-t-il un autre exemple de code disponible? Croyez-moi, je google depuis un moment.

18
Sam B

Ok, j'ai compris ça. Le problème avec Assets Library est qu'il vous donne toutes les données GEO de l'image. Ce que cela signifie pour vos utilisateurs qui utilisent votre application, c'est qu'ils recevront une invite indiquant que votre application tente d'accéder à leur emplacement. En fait, tout ce que vous essayez de faire est de les laisser choisir plusieurs images de leur album photo. La plupart des utilisateurs seront désactivés en pensant que c'est un problème de piratage. La meilleure approche consiste à utiliser l'api des pommes de imagePickerController. Je sais que cela vous permet de choisir une image à la fois, mais si vous ajoutez le code suivant, il vous permettra de choisir plusieurs images.

La façon dont je fais est de laisser les utilisateurs continuer à sélectionner les images qu'ils souhaitent, continuer à enregistrer ces fichiers dans le répertoire des documents de l'application, jusqu'à ce qu'ils cliquent sur le bouton Terminé. Voir ici mon exemple de code et j'espère que cela vous évitera de parcourir la bibliothèque des actifs

-(IBAction)selectExitingPicture
{
    //Specially for fing iPAD
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];

    popoverController = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
    [popoverController presentPopoverFromRect:CGRectMake(0.0, 0.0, 400.0, 300.0) 
                             inView:self.view
           permittedArrowDirections:UIPopoverArrowDirectionAny 
                           animated:YES];
}

//Done button on top
- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{    
    //NSLog(@"Inside navigationController ...");


    if (!doneButton) 
    {
        doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                      style:UIBarButtonItemStyleDone
                                                     target:self action:@selector(saveImagesDone:)];
    }

    viewController.navigationItem.rightBarButtonItem = doneButton;
}

- (IBAction)saveImagesDone:(id)sender
{
    //NSLog(@"saveImagesDone ...");

    [popoverController dismissPopoverAnimated:YES];
}


-(void)imagePickerController:(UIImagePickerController *)picker
      didFinishPickingImage : (UIImage *)image
                 editingInfo:(NSDictionary *)editingInfo
{


    //DONT DISMISS
    //[picker dismissModalViewControllerAnimated:YES];
    //[popoverController dismissPopoverAnimated:YES];

        IMAGE_COUNTER = IMAGE_COUNTER + 1;

        imageView.image = image;

        // Get the data for the image
        NSData* imageData = UIImageJPEGRepresentation(image, 1.0);


        // Give a name to the file
        NSString* incrementedImgStr = [NSString stringWithFormat: @"UserCustomPotraitPic%d.jpg", IMAGE_COUNTER];


        NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString* documentsDirectory = [paths objectAtIndex:0];

        // Now we get the full path to the file
        NSString* fullPathToFile2 = [documentsDirectory stringByAppendingPathComponent:incrementedImgStr];

        // and then we write it out
        [imageData writeToFile:fullPathToFile2 atomically:NO];

}

// Utilisez maintenant ce code pour accéder aux images sélectionnées par l'utilisateur. Appelez-le où vous voulez dans votre code

 NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask ,YES);
        NSString* documentsPath = [paths objectAtIndex:0];
        NSString* dataFile = [documentsPath stringByAppendingPathComponent:@"UserCustomPotraitPic1.jpg"];

        NSData *potraitImgData = [NSData dataWithContentsOfFile:dataFile];
        backgroundImagePotrait = [UIImage imageWithData:potraitImgData];
20
Sam B

Apple a fourni une API pour cela. Il s'appelle ALAssetsLibrary .

En utilisant cela, vous pouvez sélectionner plusieurs images/vidéos et d'autres opérations que vous effectuez en utilisant l'application photo sur un appareil iOS.

Comme dans documentation Apple dit:

Cadre de la bibliothèque des actifs

Introduit dans iOS 4.0, le cadre de la bibliothèque de ressources (AssetsLibrary.framework) fournit une interface basée sur des requêtes pour récupérer des photos et des vidéos à partir de l'appareil de l'utilisateur. À l'aide de ce cadre, vous pouvez accéder aux mêmes éléments qui sont normalement gérés par l'application Photos, y compris les éléments de l'album de photos enregistrées de l'utilisateur et toutes les photos et vidéos importées sur l'appareil. Vous pouvez également enregistrer de nouvelles photos et vidéos dans l'album de photos enregistrées de l'utilisateur.

Voici quelques liens où vous pouvez en savoir plus. Maintenant, pour l'utiliser, vous pouvez rechercher ALAssetsLibrary.

Référence de la bibliothèque de ressources

http://www.fiveminutes.eu/accessing-photo-library-using-assets-library-framework-on-iphone/

9
Ravin

J'utilise ALAssetsLibrary et ai roulé ma propre interface utilisateur. Le problème avec UIImagePickerController est qu'il dit que vous êtes censé rejeter le contrôleur de vue dans le rappel didFinishPickingMediaWithInfo, donc le piratage de la sélection multiple en ne fermant pas peut entraîner des problèmes. Je sais que je l'ai fait lors de mon premier essai. Je ne me souviens pas exactement de ce qui s'est mal passé, mais il y a eu des cas où UIImagePickerController a simplement cessé de fonctionner si je ne l'ai pas rejeté comme le disent les docs.

1
Mark Krenek