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.
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];
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/
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.