2017-01-11 46 views
11

Mam problem z zaimplementowaniem kontrolera widoku kamery dla aplikacji na iOS, nad którą pracuję. Po naciśnięciu przycisku mam obiekt kamery jednoelementowej, który zarządza stroną i przechwytuje obraz. Jak widać poniżej, po przechwyceniu kamery UIImage, przechodzę przez blok zakończenia, który go wykorzystuje.Niepowodzenie PHAssetChangeRequest dla UIImage wykonanego aparatem

Pierwsza z poniższych metod to akcja uruchamiana po naciśnięciu przycisku fotografowania w aparacie. Po pierwsze, warstwa kamery zostaje zatrzymana poprzez wyłączenie połączenia w warstwie podglądu, a następnie przechwycenie obrazu. Następnie obiekt kamery przechwytuje obiekt UIImage, w którym to momencie usuwam warstwę podglądu z kamery z widoku, a zamiast niej dodam subview UIImageView z przechwyconym obrazem w jego miejsce.

Następnie chcę dodać obraz do albumu, który utworzyłem w Zdjęciach przy użyciu frameworku Zdjęcia. Mogę utworzyć album bez problemu i zweryfikowałem obiekt PHAssetCollection. Używam w drugiej metodzie jest poprawna.

Z jakiegoś powodu nie mogę dodać przechwyconego albumu do albumu UIImage. Próbowałem dodać do albumu losowy plik obrazu, który miałem w swoim projekcie, a operacja zakończyła się pomyślnie. Sprawdziłem również, czy poprawny obraz został pomyślnie przekazany do metody addPhotoToSavedPhotos za pomocą instrukcji NSLog w celu sprawdzenia opisu obrazu w obu metodach. To prowadzi mnie do przekonania, że ​​coś jest nie tak z obrazem, ale obraz wyświetla go z powodzeniem, więc nie jestem pewien, co to może być.

Jeśli ktoś ma jakieś pomysły na rozwiązania, które mógłbym spróbować, byłbym wdzięczny. Również error.localizedDescription z instrukcji NSLog w drugiej metodzie wyprowadza "The operation couldn't be completed. (Błąd kakao -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

pan naprawić? – kondratyevdev

+0

możesz nam powiedzieć, co jest wydrukowany w dzienniku? –

+0

Może być gdzieś tutaj błąd, myślę, że self addPhotoToSavedPhotos: [image copy]]; Spróbuj dodać breakPoint w - (void) addPhotoToSavedPhotos: (UIImage *), funkcję zdjęcia i sprawdź, czy do tej funkcji zostało przesłane zdjęcie. –

Odpowiedz

2

Spróbuj coś takiego Kodeks sprawdzi pogodowymi album istnieje lub nie pierwszy

#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 wyskakuje okno dialogowe uprawnień. UI musi być zawsze w głównym wątek.

Spróbuj przesunąć PHAssetChangeRequest z zwrotnego.