Сбой 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 из обратного вызова.

Другие вопросы по тегам