iphone - organizar - icloud
Guarde las fotos en el álbum personalizado en la biblioteca de fotos de iPhones (5)
Si usa iOS6, la respuesta de Fernando no funcionará, porque el selector de guardar imagen ya no está disponible.
El proceso es bastante confuso, y no he visto ninguna respuesta clara publicada, así que aquí está el método que he usado para resolver esto en iOS6.
Deberá usar una combinación de los siguientes:
Crea el álbum:
[self.library addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
NSLog(@"added album:%@", albumName);
}
failureBlock:^(NSError *error) {
NSLog(@"error adding album");
}];
Encuentra el Album:
__block ALAssetsGroup* groupToAddTo;
[self.library enumerateGroupsWithTypes:ALAssetsGroupAlbum
usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:albumName]) {
NSLog(@"found album %@", albumName);
groupToAddTo = group;
}
}
failureBlock:^(NSError* error) {
NSLog(@"failed to enumerate albums:/nError: %@", [error localizedDescription]);
}];
Guarde la imagen en la biblioteca de activos y colóquela en el álbum:
CGImageRef img = [image CGImage];
[self.library writeImageToSavedPhotosAlbum:img
metadata:[info objectForKey:UIImagePickerControllerMediaMetadata]
completionBlock:^(NSURL* assetURL, NSError* error) {
if (error.code == 0) {
NSLog(@"saved image completed:/nurl: %@", assetURL);
// try to get the asset
[self.library assetForURL:assetURL
resultBlock:^(ALAsset *asset) {
// assign the photo to the album
[groupToAddTo addAsset:asset];
NSLog(@"Added %@ to %@", [[asset defaultRepresentation] filename], albumName);
}
failureBlock:^(NSError* error) {
NSLog(@"failed to retrieve image asset:/nError: %@ ", [error localizedDescription]);
}];
}
else {
NSLog(@"saved image failed./nerror code %i/n%@", error.code, [error localizedDescription]);
}
}];
Intento crear un álbum personalizado en la Biblioteca de fotos de un iPhone y luego guardar las fotos que tomé con la cámara, o seleccionar desde los teléfonos Camera Roll para ese álbum personalizado. Puedo crear el álbum con éxito, pero las fotos no se guardan allí, sino que se guardan en el álbum de Fotos guardadas de los simuladores ... No estoy seguro de cómo decirle a UIImageWriteToSavedPhotosAlbum
que lo guarde en el nuevo álbum que acabo de crear usando addAssetsGroupAlbumWithName
...
Aquí está el código que tengo hasta ahora: he cortado algunas secciones para mantener mi ejemplo de código corto ...
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage])
{
// pull GPS information from photos metadata using ALAssetsLibrary
void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
{
// code snipped out
};
NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
resultBlock:ALAssetsLibraryAssetForURLResultBlock
failureBlock:^(NSError *error)
{
// code snipped out
}];
// getimage from imagePicker and resize it to the max size of the iPhone screen
UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImage *resizedImage = [util_ createThumbnailForImage:originalImage thumbnailSize:[util_ determineIPhoneScreenSize]];
NSData *imageData = UIImagePNGRepresentation(resizedImage);
// code snipped out
// code snipped out
// code snipped out
// code snipped out
// code snipped out
// code snipped out
// create a new album called "My Apps Photos"
[library addAssetsGroupAlbumWithName:@"My Apps Photos"
resultBlock:^(ALAssetsGroup *group)
{
NSLog(@"in addAssetsGroupAlbumWithName resultBlock");
// save file to album
UIImageWriteToSavedPhotosAlbum(resizedImage, self, nil, nil);
}
failureBlock:^(NSError *error)
{
NSLog(@"in addAssetsGroupAlbumWithName failureBlock");
}
];
}
}
Entonces ... Como dije, crea el nuevo álbum pero no guarda la foto allí. ¿Cómo digo que guarde en el nuevo álbum? Tal vez suene no usar UIImageWriteToSavedPhotosAlbum
??
Nota: Estoy usando Xcode 4.3.2, IOS 5.1 y ARC
El código de @Scott Allen estaba cerca pero no me salvó la imagen la primera vez. Entonces, si no hubiera creado el álbum, la imagen no se guardaría. Mi solución fue mover este fragmento que crea el álbum al delegado de la aplicación didFinishLaunchingWithOptions:
NSString *albumName=@"album name";
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
NSLog(@"added album:%@", albumName);
}
failureBlock:^(NSError *error) {
NSLog(@"error adding album");
}];
No he visto respuestas y códigos realmente claros para estas preguntas. Para mí, quería asegurarme de que el álbum fue encontrado o creado, antes de encender la cámara. Este código parece ser correcto, y creo que es un poco más limpio y fácil de robar ^ H ^ H ^ H ^ H ^ HInicio de.
// find or create our photo album. If either works
// we fire up the camera. Crazy asynchronous code here.
__weak PhotoVC *weakSelf = self;
__block BOOL found = NO;
ALAssetsLibraryGroupsEnumerationResultsBlock
assetGroupEnumerator = ^(ALAssetsGroup *group, BOOL *stop){
if (group) {
NSString *thisGroup = [group valueForProperty:ALAssetsGroupPropertyName];
if ([album isEqualToString:thisGroup]) {
NSLog(@"album found!");
[weakSelf startCamera: group];
*stop = YES;
found = YES;
}
} else { // not found, create the album
if (found)
return;
NSLog(@"album not found, try making album");
ALAssetsLibraryGroupResultBlock addGroup =
^(ALAssetsGroup *group){
NSLog(@"album created");
[weakSelf startCamera: group];
};
ALAssetsLibraryAccessFailureBlock addGroupFailed =
^(NSError *err){
NSLog(@"add group failed: %@", [err localizedDescription]);
};
[library addAssetsGroupAlbumWithName:album resultBlock:addGroup failureBlock:addGroupFailed];
}
};
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum
usingBlock:assetGroupEnumerator
failureBlock:^(NSError *error) {
NSLog(@"album access denied");
}];
La ley de Tom Duff: roba el código siempre que puedas.
La respuesta de Fernando funcionó para mí en iOS 7.
Pasos:
1) Descargue el código ALAssetsLibrary + CustomPhotoAlbum desde aquí: http://www.touch-code-magazine.com/wp-content/uploads/2011/11/ALAssetsLibrary_CustomPhotoAlbum.zip?a071b6 y copie los 2 archivos para la categoría dentro de su Proyecto Xcode.
2) En su archivo de encabezado, agregue las siguientes líneas
#import <AssetsLibrary/AssetsLibrary.h>
#import "ALAssetsLibrary+CustomPhotoAlbum.h"
@property (strong, atomic) ALAssetsLibrary* library;
3) En su archivo de implementación, agregue las siguientes líneas
@synthesize library=_library;
EDITAR : 4) Inicializar la instancia de la biblioteca de activos, preferiblemente en el método "viewDidLoad", de lo contrario, el método saveImage a continuación no se ejecutará. ( CONFIRMADO ):
[Estoy volviendo a enviar la modificación sugerida porque alguien con habilidades distintas del iPhone rechazó la presentación anterior. Esta es, sin duda, una gran respuesta de @santhu & Fernando y me ayudó mucho, sin embargo, faltaba la pieza de inicialización del código, así que me tomó un poco de tiempo averiguar por qué el código no funcionaba. Por lo tanto, agradecería si un moderador con habilidades de desarrollo de iPhone revisa la edición.]
_library = [[ALAssetsLibrary alloc] init];
5) Agregue esto en el método donde desea guardar
//Add this in the method where you wish to save
[self.library saveImage:(UIImage *) toAlbum:(NSString *) withCompletionBlock:^(NSError *error) {
if (error!=nil) {
NSLog(@"Big error: %@", [error description]);
}
}];
Para usuarios rápidos: - Hice función para hacer lo mismo.
declarar el cierre definición de clase superior (definición superior a la clase)
typealias CompletionHandler = (success:Bool!) -> Void
declarar la variable de la biblioteca dentro de la clase
var library:ALAssetsLibrary?;
inicializar la variable en viewDidLoad
library = ALAssetsLibrary();
método para agregar la imagen al álbum particular
func addImage(image:UIImage, metaData:NSDictionary, toAlbum albumName:String, handler:CompletionHandler){
library?.addAssetsGroupAlbumWithName(albumName, resultBlock: {(group:ALAssetsGroup!) -> Void in
print("/nAlbum Created:= /(albumName)");
/*-- Find Group --*/
var groupToAddTo:ALAssetsGroup?;
self.library?.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAlbum),
usingBlock: { (group:ALAssetsGroup?, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
if(group != nil){
if group!.valueForProperty(ALAssetsGroupPropertyName) as String == albumName{
groupToAddTo = group;
print("/nGroup Found /(group!.valueForProperty(ALAssetsGroupPropertyName))/n");
self.library?.writeImageToSavedPhotosAlbum(image.CGImage, metadata:metaData, completionBlock: {(assetURL:NSURL!,error:NSError!) -> Void in
if(error == nil){
self.library?.assetForURL(assetURL,
resultBlock: { (asset:ALAsset!) -> Void in
var yes:Bool? = groupToAddTo?.addAsset(asset);
if (yes == true){
handler(success: true);
}
},
failureBlock: { (error2:NSError!) -> Void in
print("Failed to add asset");
handler(success: false);
});
}
});
}
} /*Group Is Not nil*/
},
failureBlock: { (error:NSError!) -> Void in
print("Failed to find group");
handler(success: false);
});
}, failureBlock: { (error:NSError!) -> Void in
print("Failed to create /(error)");
handler(success: false);
});
}
llama a este método como: -
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
var image:UIImage = info[UIImagePickerControllerOriginalImage] as UIImage;
var metadata:NSDictionary = info[UIImagePickerControllerMediaMetadata] as NSDictionary;
self.addImage(image, metaData: metadata, toAlbum: "SwiftAlbum") { (success) -> Void in
print("Image Added : /(success)");
}
picker.dismissViewControllerAnimated(true, completion: nil);
}