Сбой PHAssetChangeRequest для UIImage, снятого камерой
У меня проблема с реализацией камеры View Controller для приложения iOS, над которым я работаю. Когда кнопка нажата, у меня есть одноэлементный объект камеры, который управляет AVFoundation
сторона вещей и захватывает изображение. Как вы можете видеть ниже, как только UIImage
захватывается с камеры, я передаю блок завершения, который использует его.
Первый метод ниже - это действие, которое срабатывает при нажатии кнопки захвата на камере. Сначала слой камеры приостанавливается путем отключения соединения на слое предварительного просмотра, затем изображение захватывается. Затем объект камеры захватывает UIImage
в этот момент я удаляю слой предварительного просмотра камеры из вида и вместо этого добавляю UIImageView
подвид с захваченным изображением на своем месте.
Далее я хочу добавить изображение в альбом, который я создал в Фото, используя платформу Photos. Я могу создать альбом без проблем, и я убедился, что PHAssetCollection
объект. Я использую во втором методе является правильным.
Однако по какой-то причине я не могу добавить UIImage
Я записываю в альбом. Я попытался добавить случайный файл изображения, который был в моем проекте, в альбом, и операция завершилась успешно. Я также проверил, что правильное изображение успешно передается 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);
}
}];
}
2 ответа
Попробуйте что-то вроде этого. Этот код проверит, существует ли первый альбом или нет.
#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);
}
}];
}
}
PHAssetChangeRequest открывает диалоговое окно с разрешениями. Пользовательский интерфейс всегда должен быть в главном потоке.
Попробуйте переместить PHAssetChangeRequest из обратного вызова.