web-dev-qa-db-de.com

UIImagePickerController-Fehler: Das Snapshot einer nicht gerenderten Ansicht führt zu einem leeren Snapshot in iOS 7

Ich bekomme diesen Fehler nur in iOS 7 und die Anwendung ist abgestürzt. Bei iOS 6 bekomme ich nie eine Fehlermeldung, nur eine Warnung des Speichers beim Öffnen der Kamera.

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Hier ist was ich mache.

imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

Ich habe versucht, den presentModalViewController zu verzögern, erhalte aber immer noch dieselbe Meldung. Nach wenigen Sekunden (7-10) stürzte die Anwendung ab.

Dieser Fehler ist nur in iOS 7 vorhanden. 

Hat jemand den Anhaltspunkt? Danke im Voraus.

102
Didats Triadi

Das Problem in iOS7 hat mit Übergängen zu tun. Es scheint, dass, wenn ein vorheriger Übergang nicht abgeschlossen wurde und Sie einen neuen starten, iOS7 die Ansichten durcheinander bringt, wo iOS6 es anscheinend richtig zu verwalten scheint.

Sie sollten Ihre Kamera in Ihrer UIViewController erst initialisieren, nachdem die Ansicht geladen wurde und ein Timeout vorliegt:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    //show camera...
    if (!hasLoadedCamera)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}

und hier ist der Initialisierungscode

- (void)showcamera {
    imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    [imagePicker setAllowsEditing:YES];

    [self presentModalViewController:imagePicker animated:YES];
}
32
Lefteris

Dieser Fehler zeigte sich auch bei Apples PhotoPicker-Beispielcodeprojekt.

Ich habe Xcode Version 5.0 und iOS 7.0.3 auf einem iPhone 4 verwendet.

Schritte zum Reproduzieren:

  1. Laden Sie das PhotoPicker-Beispielprojekt von Apple unter https://developer.Apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html herunter.

  2. In APLViewController.m kommentieren Sie die Zeile 125 aus

    //imagePickerController.showsCameraControls = NO;

  3. In APLViewController.m kommentieren Sie die Zeilen 130-133 aus

    //[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
    // self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
    // imagePickerController.cameraOverlayView = self.overlayView;
    // self.overlayView = nil;

  4. App erstellen und starten.

  5. Drehen Sie das Gerät nach dem Start in den Querformatmodus.

  6. Klicken Sie auf das Kamerasymbol, um den UIImagePickerController im Kameramodus zu öffnen.

  7. Konsolenausgabe anzeigen.

Konsolenausgabe

PhotoPicker [240: 60b] Die Momentaufnahme einer nicht gerenderten Ansicht führt zu einer leeren Momentaufnahme. Stellen Sie sicher, dass Ihre Ansicht mindestens einmal gerendert wurde, bevor Sie nach Bildschirmaktualisierungen Snapshots oder Snapshots erstellen.

showsCameraControls-Eigenschaft

Das Problem tritt für mich auf, wenn dies den Wert YES (Standardeinstellung) hat.

Wenn Sie hier NO einstellen, wurde die Nachricht nicht mehr angezeigt.

Fehlerbericht

Ich habe gerade einen Fehlerbericht bei Apple eingereicht.

Ich habe viele der Vorschläge aus verschiedenen Beiträgen ausprobiert, aber keine zufriedenstellende Problemumgehung gefunden.

18
Scott Carter

Ich hatte das Problem, als ich versuchte, die Kameraansicht in einem Popover darzustellen. Unter iOS6 war dies kein Problem, aber unter iOS7 erhielt ich die Nachricht

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

auch. 

Nachdem ich jedoch die Darstellung der Kameraansicht auf Vollbild umgestellt hatte, wie unter Bilder und Filme aufnehmen, iOS Developer Library alles lief wieder einwandfrei und die Nachricht erschien nie mehr. Ich musste jedoch sicherstellen, dass abhängig vom Modus der App (d. H. Anzeige der Kameraansicht oder Fotorolle) ich das Popover oder den Ansichtscontroller immer dann deaktivieren musste, wenn die Methode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker aufgerufen wurde.

11
Arne

erstellen Sie eine Eigenschaft 

@property (nonatomic) UIImagePickerController *imagePickerController;

Dann 

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationCurrentContext;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
self.imagePickerController = picker;
[self presentViewController:self.imagePickerController animated:YES completion:nil];

Dies sollte das Problem lösen

6
Asfanur

Ich habe diesen Code verwendet, um das Problem zu umgehen:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [imagePicker setShowsCameraControls:NO];
    [self presentViewController:imagePicker animated:YES completion:^{
        [imagePicker setShowsCameraControls:YES];
    }];
} else {
    [imagePicker setShowsCameraControls:YES];
    [self presentModalViewController:imagePicker animated:YES];
}
4

Ich hatte das gleiche Problem, als ich versuchte, die Demo-App zu ändern, die mit dem Avirary SDK , In der Demo-App geliefert wird. Sie kann nur das von der Kamerarolle aufgenommene Foto bearbeiten. Um zu versuchen, das Foto durch Aufnehmen von der Kamera zu bearbeiten, habe ich zunächst den folgenden Code in die Datei UIViewcontroller.m eingefügt:

#pragma mark - Take Picture from Camera
- (void)showCamera
{
//[self launchPhotoEditorWithImage:sampleImage highResolutionImage:nil];

    if ([self hasValidAPIKey]) {
        UIImagePickerController * imagePicker = [UIImagePickerController new];
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [imagePicker setDelegate:self];
        [imagePicker setAllowsEditing:YES]; //important, must have

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            [self presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self presentViewControllerInPopover:imagePicker];
        }
    }
}

Beim Ausführen der App ist der Fehler aufgetreten:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Um den Fehler zu beheben, haben Sie den UIImagePicker-Delegaten in Ihrer UIViewContooler.m-Datei wie folgt geändert:

#pragma mark - UIImagePicker Delegate

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    void(^completion)(void)  = ^(void){

        [[self assetLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            if (asset){
                [self launchEditorWithAsset:asset];
            }
        } failureBlock:^(NSError *error) {
            [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable access to your device's photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        }];

        UIImage * editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
        if(editedImage){
            [self launchPhotoEditorWithImage:editedImage highResolutionImage:editedImage];
        }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self dismissViewControllerAnimated:YES completion:completion];
    }else{
        [self dismissPopoverWithCompletion:completion];
    }

}    

Dann ist der Fehler verschwunden und die App funktioniert!

3
Tony

Diese Fehlermeldung wird angezeigt, wenn Sie eine App mit iOS SDK 6.1 erstellen, ein Ziel für die Bereitstellung von iOS 6.1 erstellen und eine App auf einem iOS 7-basierten iPhone ausführen. Die App stürzt nicht ab, aber die Implementierung der UIViewController shouldAutorotate-Methode hilft mir, die Fehlermeldung zu entfernen.

- (BOOL)shouldAutorotate {
    return YES;
}
3
Grigori A.

Ich habe das gleiche Problem und habe eine Lösung gefunden. Ich denke, dass dieser Fehler mit der Ausrichtung Ihrer Bewerbung zusammenhängt. Meine Anwendung verwendet nur den Querformatmodus, aber UIImagePickerController verwendet den Hochformatmodus. Ich füge try.catch-Block zu main.m hinzu und erhalte eine echte Ausnahme: 

Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

Wie löse ich dieses Problem:

1) Überprüfen Sie die Geräteorientierung in Target-> General oder .plist-Datei: Unterstützte Schnittstellenorientierungen: Querformat links, Querformat rechts.

2) In AppDelegate.m hinzufügen:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}

Nach diesem Schritt funktioniert der UIImagePickerController ordnungsgemäß, aber meine Viewcontroller können in den Hochformatmodus gedreht werden. Um dies zu lösen:

3) Erstellen Sie eine Kategorie für UINavigationController (unterstützteInterfaceOrientations, die in iOS6 von UIViewController auf UINavigationController verschoben wurden):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Diese Lösung funktioniert ordnungsgemäß unter iOS 6.0, 6.1, 7.0. Hoffe das hilft.

3
Roman Ermolov

Versuchen Sie es mit 

[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];

und funktion

-(void)presentCameraView{
    [self presentViewController:imagePicker animated:YES completion:nil];
}

ersetzen. [self presentModalViewController:imagePicker animated:YES]; und ursache imagePicker als globale Variable.

1
JerryZhou

Dies ist, was es für mich in meiner App behoben hat, ymmv

zunächst einmal ist es eine iPhone - iPad App

in appname-Info.plist. In den unterstützten Schnittstellenorientierungen (iPad) wurden 4 Orientierungen angezeigt.

in der unterstützten Schnittstelle zeigten Orientierungen 3 Orientierungen. Ich habe die vierte hinzugefügt und die App ausgeführt, keine Debug-Ausgabe. 

Hoffe das hilft.

1
user1045302

Ich habe lange versucht, die Lösung zu finden, und überraschenderweise habe ich sie am Ende gefunden und es war einfach sehr lustig, als ich sie entdeckte.

Gehen Sie wie folgt vor, um das ausgewählte Bild abzurufen und die Arbeit fortzusetzen :)

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
 }

Ja, um das Problem zu lösen, müssen Sie den Picker nur wie gewöhnlich abmelden, da die folgende Meldung angezeigt wird: "Das Snapshot einer Ansicht, die nicht gerendert wurde, führt zu einem leeren Snapshot. Stellen Sie sicher, dass Ihre View mindestens einmal vor dem Snapshot oder dem Snapshot danach gerendert wurde Bildschirmaktualisierungen. " Der Picker reagiert nicht, aber Sie können ihn deaktivieren und das Bild normal abrufen. 

0
DevSherif

Ich bin gerade auf das gleiche Problem gestoßen. In meinem Fall bestand das Problem darin, dass ich nicht-ARC-Code besaß und zu ARC migriert habe. Bei der Migration hatte ich keinen starken Bezug zur UIImagePickerController und das war der Grund für den Absturz.

Ich hoffe es hilft :)

0
arturgrigor

In meinem Fall war dies mit einer Layoutänderung verbunden: Die VC, die die UIImagePickerViewController darstellt, hat die Statusleiste ausgeblendet, die UIImagePickerViewController jedoch nicht.

Also habe ich es gelöst, indem die Statusleiste in der Variablen UIImagePickerViewController ausgeblendet wurde, wie in dieser Antwort gezeigt.

0
kanobius

Ich hatte dasselbe Problem in iOS 8, aber der Zugriff auf die Kamera war in Einstellungen -> Datenschutz für meine App deaktiviert. Nur aktiviert, und es hat funktioniert.

0
BhushanVU