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"); }]; }}
- 在iOS中的cameraoverlay视图(comepicker)exlusive touch?
- UIImagepickercontroller:是否可以改变相机胶卷中图像的sorting顺序?
- 摄像头覆盖层随着方位和高程而变化
- 如何使用并使用UIImagePicker进行编辑 – UIImagePickerController.allowsEditing = YES
- 如何开发面部识别iPhone应用程序?
- 如何使用UIImagePickerControllerCropRect
- 处理AVCaptureVideoDataOutput有关方向的图像数据的build议方法是什么?
- 如何让用户从图库中select或在cordova拍照选项
- 从相机/照片库上载离子应用程序图像