C. *_*tra 10 objective-c uiimage ios photosframework phphotolibrary
我在为我正在处理的iOS应用程序实现相机View Controller时遇到问题.当按下一个按钮时,我有一个单独的相机对象来管理AVFoundation
事物的一面并捕获图像.如下所示,一旦UIImage
从相机捕获,我就会通过一个使用它的完成块.
下面的第一种方法是在相机上按下捕获按钮时触发的动作.首先,通过禁用预览图层上的连接暂停摄像机图层,然后捕获图像.然后,相机对象捕获UIImage
,此时我从视图中移除相机预览图层,而是UIImageView
在其位置添加捕获图像的子视图.
接下来,我想使用Photos框架将图像添加到我在Photos中创建的相册中.我可以毫无问题地创建相册,并且我已经验证了该PHAssetCollection
对象.我在第二种方法中使用的是正确的方法.
但是,出于某种原因,我无法将UIImage
I capture 添加到相册中.我尝试将我项目中的随机图像文件添加到相册中,操作成功完成.我还验证了addPhotoToSavedPhotos
通过使用NSLog
语句检查两种方法中的图像描述,成功传递了正确的图像.这让我相信图像不知何故出了问题,但是imageView成功地显示了它,所以我不确定它可能是什么.
如果有人对我可能会尝试的解决方案有任何想法,我将不胜感激.另外error.localizedDescription
从NSLog
第二种方法中的语句输出"The operation couldn't be completed
.(可可错误-1)."
- (IBAction)capturePhoto:(id)sender {
[self pauseCameraLayer];
[[eventCamera sharedInstance] captureStillUIImage:^(UIImage *image, NSError *error){
if(error)
{
NSLog(@"error capturing photo");
}
else
{
NSLog(@"%@",image.debugDescription);
}
[_captureButton setHidden:YES];
[_switchCameraButton setHidden:YES];
UIImageView *preview=[[UIImageView alloc] initWithImage:image];
[preview setAutoresizesSubviews:YES];
[preview setContentMode:UIViewContentModeScaleAspectFit];
[preview setTransform:CGAffineTransformMakeRotation(M_PI_2)];
preview.frame=_imageView.bounds;
[_imageView addSubview:preview];
[self addPhotoToSavedPhotos:[image copy]];
NSLog(@"1: %@",image.description);
}];
-(void)addPhotoToSavedPhotos:(UIImage*)photo
{
PHAssetCollection *myCollection=[self getAPPCollection];
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//Perform changes to photo library
PHAssetChangeRequest *req=[PHAssetChangeRequest creationRequestForAssetFromImage:photo];
PHAssetCollectionChangeRequest *assetChangeRequest=[PHAssetCollectionChangeRequest changeRequestForAssetCollection:myCollection];
[assetChangeRequest addAssets:[NSArray arrayWithObject:req.placeholderForCreatedAsset]];
//[libReq addAssets:@[assetPlaceHolder]];
}completionHandler:^(BOOL success, NSError *error){
//Perform any necessary actions after adding the photo to the photo
//library
if(!success)
{
NSLog(@"didn't succeed, error: %@",error.localizedDescription);
}
}];
}
Run Code Online (Sandbox Code Playgroud)
小智 1
尝试这样的东西此代码将首先检查专辑是否存在
#import <Photos/Photos.h>
- (void)addPhotoToSavedPhotos:(UIImage *)image {
NSString *albumName = @"NameOFTheAlbum";
void (^saveBlock)(PHAssetCollection *assetCollection) = ^void(PHAssetCollection *assetCollection) {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
[assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];
} completionHandler:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"Error creating asset: %@", error);
}
}];
};
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.predicate = [NSPredicate predicateWithFormat:@"localizedTitle = %@", albumName];
PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
if (fetchResult.count > 0) {
saveBlock(fetchResult.firstObject);
} else {
__block PHObjectPlaceholder *albumPlaceholder;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];
albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection;
} completionHandler:^(BOOL success, NSError *error) {
if (success) {
PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil];
if (fetchResult.count > 0) {
saveBlock(fetchResult.firstObject);
}
} else {
NSLog(@"Error creating album: %@", error);
}
}];
}
}
Run Code Online (Sandbox Code Playgroud)