iPhone – 如何创build自定义相册,并以编程方式给相机胶卷中的照片提供自定义名称?

我正在开发一个iPhone照片应用程序,所以我需要在相机胶卷中创build一个名为“我的相册”的单独相册,并且需要在新创build的目录中保存具有自定义名称的例如“My Image.png”的UIImageView图像。

我怎样才能做到这一点?

您可以创build自定义相册,并在iOS中使用以下代码行轻松添加图像:

// Create the new album. __block PHObjectPlaceholder *myAlbum; [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title]; myAlbum = changeRequest.placeholderForCreatedAssetCollection; } completionHandler:^(BOOL success, NSError *error) { if (success) { PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[myAlbum.localIdentifier] options:nil]; PHAssetCollection *assetCollection = fetchResult.firstObject; [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; // add asset PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"Error: %@", error); } }]; } else { NSLog(@"Error: %@", error); } }]; 

由于AssetsLibrary已被弃用 ,请改用Photos框架(iOS 8和更高版本)。

 // Deprecated! import AssetsLibrary // Swift 3.0 let assetsLibrary = ALAssetsLibrary() assetsLibrary.addAssetsGroupAlbum(withName: "NewAlbum", resultBlock: { assetsGroup in print(assetsGroup == nil ? "Already created" : "Success") }, failureBlock: { error in print(error) }) 

您可以使用共享的PHPhotoLibrary对象来创build新的照片,但不能给它们具体名称,因为您将使用需要由Photos.apppipe理的资源 。 每个资产都有特定的属性。 您可以获取对象,请求更改,资产/缩略图加载和caching等。

要创build自定义相册 ,请使用PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:

简单的例子:

 // Swift 3.0 func createPhotoLibraryAlbum(name: String) { var albumPlaceholder: PHObjectPlaceholder? PHPhotoLibrary.shared().performChanges({ // Request creating an album with parameter name let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: name) // Get a placeholder for the new album albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection }, completionHandler: { success, error in if success { guard let placeholder = albumPlaceholder else { fatalError("Album placeholder is nil") } let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil) guard let album: PHAssetCollection = fetchResult.firstObject else { // FetchResult has no PHAssetCollection return } // Saved successfully! print(album.assetCollectionType) } else if let e = error { // Save album failed with error } else { // Save album failed with no error } }) } 

不要忘记import Photos库。

要在该相册上创build新的照片 PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: 资源 ,请使用PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:

 // Swift 3.0 func createPhotoOnAlbum(photo: UIImage, album: PHAssetCollection) { PHPhotoLibrary.shared().performChanges({ // Request creating an asset from the image let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: photo) // Request editing the album guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album) else { // Album change request has failed return } // Get a placeholder for the new asset and add it to the album editing request guard let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else { // Photo Placeholder is nil return } albumChangeRequest.addAssets([photoPlaceholder] as NSArray) }, completionHandler: { success, error in if success { // Saved successfully! } else if let e = error { // Save photo failed with error } else { // Save photo failed with no error } }) } 

更新:

我们需要请求访问才能使用照片库:

 PHPhotoLibrary.requestAuthorization { status in switch status { ... } 

从iOS 10及更高版本开始,我们还需要在“隐私 – 照片库使用说明”的目标.plist文件中添加访问条目:

 <key>NSPhotoLibraryUsageDescription</key> <string>Access to photos is needed to provide app features</string> 

它从iOS 5.0开始工作。
请导入AssetsLibrary / AssetsLibrary.h

 ALAssetsLibrary* libraryFolder = [[ALAssetsLibrary alloc] init]; [libraryFolder addAssetsGroupAlbumWithName:@"My Album" resultBlock:^(ALAssetsGroup *group) { NSLog(@"Adding Folder:'My Album', success: %s", group.editable ? "Success" : "Already created: Not Success"); } failureBlock:^(NSError *error) { NSLog(@"Error: Adding on Folder"); }]; 

你可以尝试下面的方法创build相册iOS 7和iOS 8

 #define PHOTO_ALBUM_NAME @"AlbumName Videos" -(void)createAlbum{ // PHPhotoLibrary_class will only be non-nil on iOS 8.xx Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary"); if (PHPhotoLibrary_class) { // iOS 8..x. . code that has to be called dynamically at runtime and will not link on iOS 7.xx ... [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:PHOTO_ALBUM_NAME]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"Error creating album: %@", error); }else{ NSLog(@"Created"); } }]; }else{ [self.library addAssetsGroupAlbumWithName:PHOTO_ALBUM_NAME resultBlock:^(ALAssetsGroup *group) { NSLog(@"adding album:'Compressed Videos', success: %s", group.editable ? "YES" : "NO"); if (group.editable == NO) { } } failureBlock:^(NSError *error) { NSLog(@"error adding album"); }]; }}