2017-01-11 13 views
11

У меня возникла проблема с реализацией камеры View Controller для приложения iOS, над которым я работаю. Когда нажимается кнопка, у меня есть одноэлементный объект камеры, который управляет стороной AVFoundation и захватывает изображение. Как вы можете видеть ниже, как только UIImage будет захвачен с камеры, я передаю блок завершения, который его использует.Ошибка PHAssetChangeRequest для UIImage с камеры

Первый способ, приведенный ниже, - это действие, которое срабатывает при нажатии кнопки захвата на камеру. Во-первых, слой камеры приостанавливается отключением соединения на уровне предварительного просмотра, после чего изображение захватывается. Затем объект камеры захватывает UIImage, после чего я удаляю слой предварительного просмотра камеры из представления и вместо этого добавляю subview UIImageView с захваченным изображением на его месте.

Далее, я хочу добавить изображение в альбом, который я создал в Фото, используя рамки Фотографии. Я могу создать альбом без проблем, и я подтвердил, что объект PHAssetCollection. Я использую во втором методе правильный.

По какой-то причине, однако, я не могу добавить запись UIImage в альбом. Я попытался добавить в альбом случайный файл изображения, который был у меня в моем проекте, и операция завершилась успешно. Я также подтвердил, что правильное изображение успешно передается методу addPhotoToSavedPhotos с помощью операторов NSLog для проверки описания изображения в обоих методах. Это заставляет меня поверить, что что-то не так с изображением, но ImageView успешно отображает его, поэтому я не уверен, что это может быть.

Если у кого-то есть идеи решения, я могу попробовать, я был бы признателен. Также error.localizedDescription из инструкции NSLog во втором методе выводит "The operation couldn't be completed. (Cocoa ошибка -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); 
     } 
    }]; 
} 
+0

вы исправить это? – kondratyevdev

+0

пожалуйста, вы можете сказать нам, что печатается в журнале? –

+0

Может быть ошибка где-то здесь. Я думаю, что self addPhotoToSavedPhotos: [image copy]]; Попробуйте добавить функцию breakPoint in - (void) addPhotoToSavedPhotos: (UIImage *) и проверить, есть ли фотография, передаваемая в эту функцию. –

ответ

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); 
       } 
      }]; 
     } 
    } 
0

PHAssetChangeRequest появляется диалоговое окно разрешений. Пользовательский интерфейс должен всегда быть в основном нить.

Попробуйте переместить PHAssetChangeRequest из обратного вызова.