2017-01-11 2 views
11

Ich habe ein Problem bei der Implementierung einer Kamera View Controller für eine iOS App, die ich gerade arbeite. Wenn eine Taste gedrückt wird, habe ich ein Singleton-Kamera-Objekt, das die AVFoundation Seite der Dinge verwaltet und das Bild erfasst. Wie Sie unten sehen können, übergebe ich, sobald die UIImage von der Kamera erfasst wurde, einen Completion-Block, der sie benutzt.PHAssetChangeRequest fehlgeschlagen für UIImage mit Kamera genommen

Bei der ersten Methode handelt es sich um eine Aktion, die ausgelöst wird, wenn die Aufnahmetaste auf der Kamera gedrückt wird. Zuerst wird die Kameraebene angehalten, indem die Verbindung auf der Vorschauebene deaktiviert und das Bild aufgenommen wird. Dann erfasst das Kameraobjekt den Wert UIImage. An dieser Stelle entferne ich den Kameravorschau-Layer aus der Ansicht und fügt stattdessen eine Unteransicht UIImageView mit dem aufgenommenen Bild an dessen Stelle ein.

Als nächstes möchte ich das Bild zu dem Album hinzufügen, das ich in Photos mit dem Photos-Framework erstellt habe. Ich kann das Album ohne ein Problem erstellen, und ich habe das Objekt PHAssetCollection überprüft. Ich verwende in der zweiten Methode die richtige.

Aus irgendeinem Grund kann ich jedoch nicht die UIImage, die ich in das Album aufnehmen, hinzufügen. Ich habe versucht, dem Album eine zufällige Bilddatei hinzuzufügen, die ich in meinem Projekt hatte, und der Vorgang wurde erfolgreich abgeschlossen. Ich habe auch überprüft, dass das korrekte Bild erfolgreich an die addPhotoToSavedPhotos-Methode übergeben wird, indem Sie NSLog-Anweisungen verwenden, um die Bildbeschreibung in beiden Methoden zu überprüfen. Das führt mich zu der Annahme, dass etwas mit dem Bild irgendwie nicht stimmt, aber das ImageView zeigt es erfolgreich an, so dass ich nicht sicher bin, was das sein könnte.

Wenn jemand irgendwelche Ideen von Lösungen hat, könnte ich versuchen, würde ich es schätzen. Auch die error.localizedDescription aus der NSLog Anweisung in der zweiten Methode gibt "The operation couldn't be completed aus. (Cocoa Fehler -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

behebe Sie das? – kondratyevdev

+0

können Sie uns bitte sagen, was wird im Protokoll gedruckt? –

+0

Es kann ein Fehler irgendwo hier sein Ich schätze selbst fügePhotoToSavedPhotos hinzu: [image copy]]; Versuchen Sie einen BreakPoint in - (void) addPhotoToSavedPhotos: (UIImage *) Fotofunktion hinzuzufügen und prüfen Sie, ob ein Foto an diese Funktion übergeben wird. –

Antwort

2

Probieren Sie etwas wie diese Dieser Kodex wird prüfen wheather Album existiert oder nicht zuerst

#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 erscheint einen Berechtigungsdialog. UI muss immer in der Haupt sein Gewinde.

Versuchen Sie, die PHAssetChangeRequest aus dem Rückruf zu bewegen.

Verwandte Themen