http://bluereader.org/article/102764087
iOS系统提供了保存图片的方法,但是该方法有一个弊端,该方法无法指定要保存图片的相册名称。 UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo);
目前很多图片相关应用都会将图片写入指定相册,下面提供简单的写入指定相册的方法。 我大概设计了这么几个接口,如下代码所示
[STAlumbManager.h] [url] [link text]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@class UIImage ;
typedef void ( ^ STAlbumSaveHandler )( UIImage * image , NSError * error );
/**
* @brief 将图片写入相册,使用ALAssetLibrary
*
* @param image 需要写入的图片
* @param album 相册名称,如果相册不存在,则新建相册
* @param completionHandler 回调
*/
extern void STImageWriteToPhotosAlbum ( UIImage * image , NSString * album , STAlbumSaveHandler completionHandler );
@interface STAlbumManager : NSObject
+ ( instancetype ) sharedManager ;
/**
* @brief 将图片写入相册,使用ALAssetLibrary
*
* @param image 需要写入的图片
* @param album 相册名称,如果相册不存在,则新建相册
* @param completionHandler 回调
*/
- ( void ) saveImage : ( UIImage * ) image toAlbum : ( NSString * ) album completionHandler : ( STAlbumSaveHandler ) completionHandler ;
@end
@interface ALAssetsLibrary ( STAssetsLibrary )
- ( void ) writeImage : ( UIImage * ) image toAlbum : ( NSString * ) album completionHandler : ( STAlbumSaveHandler ) completionHandler ;
@end
实现文件
[STAlumbManager.m] [url] [link text]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#import "STAlbumManager.h"
#import <UIKit/UIKit.h>
void STImageWriteToPhotosAlbum ( UIImage * image , NSString * album , STAlbumSaveHandler completionHandler ) {
[[ STAlbumManager sharedManager ] saveImage : image toAlbum : album completionHandler : completionHandler ];
}
@interface STAlbumManager ()
@property ( nonatomic , strong ) ALAssetsLibrary * assetsLibrary ;
@end
@implementation STAlbumManager
static STAlbumManager * _sharedManager ;
+ ( instancetype ) sharedManager {
static dispatch_once_t onceToken ;
dispatch_once ( & onceToken , ^ { _sharedManager = [[ self alloc ] init ]; });
return _sharedManager ;
}
- ( instancetype ) init {
self = [ super init ];
if ( self ) {
}
return self ;
}
- ( ALAssetsLibrary * ) assetsLibrary {
if ( ! _assetsLibrary ) {
_assetsLibrary = [[ ALAssetsLibrary alloc ] init ];
}
return _assetsLibrary ;
}
- ( void ) saveImage : ( UIImage * ) image toAlbum : ( NSString * ) album completionHandler : ( STAlbumSaveHandler ) completionHandler {
[ self . assetsLibrary writeImage : image
toAlbum : album
completionHandler : ^ ( UIImage * image , NSError * error ) {
if ( completionHandler ) {
completionHandler ( image , error );
}
/// 注意,这里每次都置空是因为期间如果操作相册了,下次保存之前希望能取到最新状态。
self . assetsLibrary = nil ;
}];
}
@end
@implementation ALAssetsLibrary ( STAssetsLibrary )
- ( void ) writeImage : ( UIImage * ) image toAlbum : ( NSString * ) album completionHandler : ( STAlbumSaveHandler ) completionHandler {
[ self writeImageToSavedPhotosAlbum : image . CGImage
orientation :( ALAssetOrientation ) image . imageOrientation
completionBlock : ^ ( NSURL * assetURL , NSError * error ) {
if ( error ) {
if ( completionHandler ) {
completionHandler ( image , error );
}
} else {
[ self addAssetURL : assetURL
toAlbum : album
completionHandler : ^ ( NSError * error ) {
if ( completionHandler ) {
completionHandler ( image , error );
}
}];
}
}];
}
- ( void ) addAssetURL : ( NSURL * ) assetURL toAlbum : ( NSString * ) album completionHandler : ( ALAssetsLibraryAccessFailureBlock ) completionHandler {
void ( ^ assetForURLBlock )( NSURL * , ALAssetsGroup * ) = ^ ( NSURL * URL , ALAssetsGroup * group ) {
[ self assetForURL : assetURL
resultBlock : ^ ( ALAsset * asset ) {
[ group addAsset : asset ];
completionHandler ( nil );
}
failureBlock : ^ ( NSError * error ) { completionHandler ( error ); }];
};
__block ALAssetsGroup * group ;
[ self enumerateGroupsWithTypes : ALAssetsGroupAlbum
usingBlock : ^ ( ALAssetsGroup * _group , BOOL * stop ) {
if ([ album isEqualToString :[ _group valueForProperty : ALAssetsGroupPropertyName ]]) {
group = _group ;
}
if ( ! _group ) {
/// 循环结束
if ( group ) {
assetForURLBlock ( assetURL , group );
} else {
[ self addAssetsGroupAlbumWithName : album
resultBlock : ^ ( ALAssetsGroup * group ) { assetForURLBlock ( assetURL , group ); }
failureBlock : completionHandler ];
}
}
}
failureBlock : completionHandler ];
}
@end
简单介绍一下代码的使用方法 该接口定义申明了一个 C方法,用来提供便捷的保存调用,使用方可以直接通过调用 extern void STImageWriteToPhotosAlbum(UIImage *image, NSString *album, STAlbumSaveHandler completionHandler);
就可以直接保存对应的image到对应的album,如果没有找到album,则会创建新的album,图片保存完毕之后,会调用block回调。 或者使用Manager单例所提供的方法 - (void)saveImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler
这样就实现了将图片保存到指定相册,感谢 技术笨 提供Demo