我正在尝试在iPhone的照片库中创建自定义相册,然后将我用相机拍摄的照片或从手机相机胶卷中选择的照片保存到该自定义相册中。我可以成功创建相册,但照片没有保存在那里,而是保存到模拟器保存的照片相册中......我不确定如何告诉UIImageWriteToSavedPhotosAlbum
保存到我刚刚使用addAssetsGroupAlbumWithName
创建的新专辑中......
这是我到目前为止的代码 - 我已经剪掉了一些部分以保持我的代码示例简短......
- (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");
}
];
}
}
所以。。。就像我说的,它会创建新相册,但不会将照片保存在那里。如何告诉它保存到新相册中?也许我听起来不使用UIImageWriteToSavedPhotosAlbum
??
注意:我使用的是 Xcode 4.3.2、IOS 5.1 和 ARC
如果您使用的是 iOS6,费尔南多的答案将不起作用,因为 saveImage 选择器不再可用。
这个过程非常混乱,我没有看到任何明确的答案,所以这是我在iOS6中用来解决这个问题的方法。
您将需要使用以下组合:
创建相册:
[self.library addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
NSLog(@"added album:%@", albumName);
}
failureBlock:^(NSError *error) {
NSLog(@"error adding 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]);
}];
将图像保存到资源库,并将其放入相册中:
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 %in%@", error.code, [error localizedDescription]);
}
}];
费尔南多的回答在iOS 7中对我有用。
步骤:
1) 从这里下载 ALAssetsLibrary+CustomPhotoAlbum 代码:http://www.touch-code-magazine.com/wp-content/uploads/2011/11/ALAssetsLibrary_CustomPhotoAlbum.zip?a071b6 并复制 Xcode 项目中该类别的 2 个文件。
2)在头文件中,添加以下行
#import <AssetsLibrary/AssetsLibrary.h>
#import "ALAssetsLibrary+CustomPhotoAlbum.h"
@property (strong, atomic) ALAssetsLibrary* library;
3)在您的实现文件中,添加以下行
@synthesize library=_library;
编辑:4)初始化资源库实例,最好在"viewDidLoad"方法中,否则下面的saveImage方法将无法执行。(已确认):
[我正在重新提交建议的编辑,因为具有非iPhone技能的人拒绝了之前的提交。毫无疑问,这是@santhu和费尔南多的一个很好的答案,对我帮助很大,但是,初始化代码缺失,所以我花了一点时间来弄清楚为什么代码不起作用。因此,如果具有iPhone开发技能的版主审查编辑,我将不胜感激。
_library = [[ALAssetsLibrary alloc] init];
5)将其添加到要保存的方法中
//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]);
}
}];
对于快速用户:- 我做了函数来做同样的事情。
声明闭包超大类定义(上面的类定义)
typealias CompletionHandler = (success:Bool!) -> Void
在类中声明库变量
var library:ALAssetsLibrary?;
在视图中初始化变量DidLoad
library = ALAssetsLibrary();
将图像添加到特定相册的方法
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);
});
}
将此方法称为 :--
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);
}
@Scott Allen 的代码很接近,但第一次不会为我保存图像。因此,如果我尚未创建相册,则图像将不会保存。 我的解决方案是将创建相册的这个代码段移动到应用程序委托 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");
}];
我还没有看到这些问题的真正明确的答案和代码。 对我来说,我想确保在启动相机之前找到或创建专辑。 这段代码似乎是正确的,我认为从中窃取^H^H^H^H^Hstart更干净,更容易。
// 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");
}];
汤姆·达夫定律:尽可能窃取代码。