UIImagePickerController-Fehler: Beim Snapshot einer Ansicht, die nicht gerendert wurde, wird in iOS 7 ein leerer Snapshot erstellt

103

Ich erhalte diesen Fehler nur in iOS 7 und die Anwendung stürzte ab. In iOS 6 wird beim Öffnen der Kamera nur einmal eine Speicherwarnung angezeigt.

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 tue.

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

[self presentModalViewController:imagePicker animated:YES];

Ich habe versucht, das zu verzögern presentModalViewController, aber ich erhalte immer noch die gleiche Nachricht. Nach einigen Sekunden (7-10) stürzte die Anwendung ab.

Dieser Fehler ist nur in iOS 7 vorhanden.

Hat jemand die Ahnung?

Didats Triadi
quelle
3
Ich habe das gleiche Problem. Unter iOS7 funktioniert UIIMagePickerController nicht mehr.
condor304
Das Aufrufen dieser Methode hat bei mir funktioniert. Platzieren Sie es, nachdem Sie Ihre Ansicht präsentiert haben. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Antworten:

32

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

Sie sollten Ihre Kamera in Ihrer Kamera UIViewControllererst initialisieren , nachdem die Ansicht geladen wurde und eine Zeitüberschreitung 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];
}
Lefteris
quelle
1
Dies scheint bisher zu funktionieren, ich habe es getestet, indem ich 10 Bilder nacheinander ohne Probleme gemacht habe.
DevC
3
presentModalViewController war in iOS 6 veraltet. Es wird empfohlen, presentViewController jetzt zu verwenden.
Gallymon
5
Das gleiche Problem und Update für iOS8.
Yauheni Shauchenka
1
Ich versuche, dies mit einem UIAertControl zum Laufen zu bringen - eine Option besteht darin, die Bildauswahl für den Fotobrowser zu präsentieren - dies funktioniert einwandfrei und die andere für die Kamera - dies funktioniert nicht. Wo würde ich die Verzögerung bei der Verwendung einbauen? ein UIALertController?
SimonTheDiver
3
Ich initialisiere die Kamera nicht in viewDidAppear / Load. Ich habe eine Tabellenansicht und rufe die Kamera als Antwort auf eine der Tabellenansichten auf. Und ich bekomme diese Fehlermeldung. Irgendwelche Ideen?
Henning
18

Dieser Fehler trat auch bei Apples PhotoPicker-Beispielcodeprojekt auf.

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 Zeile 125 auskommentieren

    //imagePickerController.showsCameraControls = NO;

  3. In APLViewController.m die Zeilen 130-133 auskommentieren

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

  4. Erstellen und starten Sie die App.

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

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

  7. Zeigen Sie die Konsolenausgabe an.

Konsolenausgabe

PhotoPicker [240: 60b] Beim Snapshot einer Ansicht, die nicht gerendert wurde, wird ein leerer Snapshot erstellt. Stellen Sie sicher, dass Ihre Ansicht mindestens einmal gerendert wurde, bevor Sie einen Schnappschuss oder einen Schnappschuss nach Bildschirmaktualisierungen erstellen.

showCameraControls-Eigenschaft

Das Problem tritt bei mir auf, wenn dies den Wert YES hat (Standardeinstellung).

Wenn Sie dies auf NEIN setzen, wird die Meldung entfernt.

Fehlerbericht

Ich habe gerade einen Fehlerbericht bei Apple eingereicht.

Ich habe viele der Vorschläge ausprobiert, die in verschiedenen Beiträgen gemacht wurden, aber keine zufriedenstellende Problemumgehung gefunden.

Scott Carter
quelle
1
Wie hat Apple dir geantwortet? Ich habe das gleiche Problem und Lösungen im Stackoverflow funktionieren nicht.
Heekyu
Ich habe noch nichts von Apple darüber gehört. Ich werde eine Antwort posten, wenn ich eine Antwort von ihnen bekomme.
Scott Carter
Neuigkeiten von Apple? @ ScottCarter
Benjamin Toueg
1
Einfach nochmal überprüft. Keine Aktion auf den offenen Fehler, seit er am 2. November 2013 eingereicht wurde.
Scott Carter
Dies ist Fehler 15377241 auf bugreport.apple.com
Scott Carter
11

Ich habe das Problem bekommen, als ich versucht habe, die Kameraansicht in einem Popover darzustellen. Unter iOS6 war dies kein Problem, aber in iOS7 bekam 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 geändert hatte, wie unter Aufnehmen von Bildern und Filmen, iOS Developer Library beschrieben , ging alles wieder in Ordnung und die Meldung wurde nie wieder angezeigt . Ich musste jedoch sicherstellen, dass ich je nachdem, in welchem ​​Modus sich die App befindet (dh Kameraansicht oder Fotorolle anzeigen), entweder das Popover oder den Ansichtscontroller schließen musste, wenn die Methode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickeraufgerufen wurde.

Arne
quelle
3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; funktioniert bei mir. Es ist das einzige, was hier erfolgreich war. Vielen Dank!
DaveMac
2
Schließlich! Ich hatte dieses Problem oft und habe nie eine gute Lösung gefunden. Fühle dich jetzt so dumm, dass du nie weiter in den Fragenthreads nach unten schaust - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; löste das für mich. Dies sollte die akzeptierte Antwort sein :)
woobione
6

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

Asfanur
quelle
3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; machte den Unterschied für mich.
Herr Berna
1
Es funktioniert, wenn der Picker zum ersten Mal angezeigt wird, aber danach kehrt die Warnung zurück.
DaveMac
Ich bestätige picker.modalPresentationStyle = UIModalPresentationCurrentContext; Löst für mich das Problem falscher Layouts in iOS 8
João Nunes
Funktioniert nicht für mich - hat dies zu einer UIButton-Aktion unter iOS 8.1.3 hinzugefügt
Andy
Dies schien vielversprechend, hat aber nichts für das Snapshot-Problem getan UND einen nutzlosen Rahmen um einen Teil des Bildes angezeigt, nachdem ein Bild aufgenommen wurde.
zeichnete ..
4

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];
}
Germán Marquès
quelle
1
Während die Idee theoretisch funktioniert, funktionieren die gezeigten Steuerelemente leider nicht oder erscheinen nicht richtig.
DaveMac
Und die Warnung wurde auch nicht
beseitigt
3

Ich habe das gleiche Problem und habe eine Lösung gefunden. Ich denke, dieser Fehler hängt mit der Ausrichtung Ihrer Anwendung zusammen. Meine Anwendung verwendet nur den Querformatmodus, aber UIImagePickerController verwendet den Hochformatmodus. Ich füge einen 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 ich dieses Problem löse:

1) Überprüfen Sie die Geräteorientierung erneut in der Datei Ziel-> Allgemein oder .plist: Unterstützte Schnittstellenausrichtungen: Querformat links, Querformat rechts.

2) Fügen Sie in AppDelegate.m hinzu:

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

Nach diesem Schritt funktioniert 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 (supportInterfaceOrientations wurde in iOS6 von UIViewController zu UINavigationController verschoben):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

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

Roman Ermolov
quelle
1
Ich repariere eine App im Hochformat, die den in OP genannten Fehler anzeigt. Es scheint also, dass Ihre Lösung nicht universell anwendbar ist.
JohnK
Haben Sie versucht, main.m einen try-catch-Block hinzuzufügen und Ausnahme und Stacktrace zu drucken?
Roman Ermolov
Wie das ?
JohnK
@ JohnK yep, so.
Roman Ermolov
3

Ich erhalte diesen Fehler, wenn ich eine App mit iOS SDK 6.1 erstelle, das Bereitstellungsziel iOS 6.1 und die App auf einem iPhone mit iOS 7-Unterstützung ausführe. App stürzt nicht ab, aber die Implementierungsmethode UIViewController shouldAutorotatehilft mir, Fehlermeldungen zu entfernen.

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

Ich hatte das gleiche Problem, als ich versuchte, die mit dem Avirary SDK gelieferte Demo-App zu ändern. In der Demo-App kann nur das von der Kamerarolle ausgewählte Foto bearbeitet werden. Um zu versuchen, das Foto durch Aufnehmen mit der Kamera zu bearbeiten, habe ich zuerst 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];
        }
    }
}

Wenn ich dann die App starte, 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!

Tony
quelle
1

Versuchen Sie dies, verwenden Sie

[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 natürlich imagePickerals globale Variable machen.

JerryZhou
quelle
1

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

Zunächst einmal ist es eine iPhone - iPad App

in appname-Info.plist. in der unterstützten Benutzeroberfläche zeigten Orientierungen (iPad) 4 Orientierungen.

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.

user1045302
quelle
0

Ich bin gerade auf das gleiche Problem gestoßen. In meinem Fall bestand das Problem darin, dass ich einen Nicht-ARC-Code hatte und diesen auf ARC migriert habe. Als ich die Migration durchführte, hatte ich keinen starken Bezug zu UIImagePickerControllerund das war der Grund für den Absturz.

Ich hoffe es hilft :)

Arturgrigor
quelle
0

Ich hatte das gleiche Problem in iOS 8, aber der Kamerazugriff war in den Einstellungen -> Datenschutz für meine App deaktiviert. Einfach aktiviert, und es hat funktioniert.

BhushanVU
quelle
0

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.

Hier ist, was Sie tun werden, 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 beheben, müssen Sie die Auswahl nur normal schließen, da die folgende Meldung angezeigt wird: "Schnappschuss einer Ansicht, die nicht gerendert wurde, führt zu einem leeren Schnappschuss. Stellen Sie sicher, dass Ihre Ansicht mindestens einmal gerendert wurde, bevor Sie einen Schnappschuss oder einen Schnappschuss danach erstellen Bildschirmaktualisierungen. " Verhindert, dass der Picker reagiert, aber Sie können ihn schließen und das Bild normal abrufen.

DevSherif
quelle
0

In meinem Fall war es mit einer Layoutänderung verbunden: Der VC, der UIImagePickerViewControllerdas präsentiert, hat die Statusleiste ausgeblendet, das aber UIImagePickerViewControllernicht.

Also habe ich es gelöst, indem ich die Statusleiste in der versteckt habe, UIImagePickerViewControllerwie es in dieser Antwort gezeigt wird .

Kanobius
quelle
-1

Sie haben Ihre Frage nicht direkt beantwortet, aber Sie haben erwähnt, dass Sie eine Speicherwarnung hatten. Möglicherweise speichern Sie das Rohbild in einer Eigenschaft, die zu einer Speicherwarnung führen kann. Dies liegt daran, dass das Rohbild ungefähr 30 MB Speicher belegt. Beim Testen von Apps auf iOS6, die sich auf der iPhone 4-Serie befanden, ist mir eine ähnliche Speicherwarnung aufgefallen. Ich habe diese Warnung immer noch erhalten, als die Geräte auf iOS7 aktualisiert wurden. Beim Testen auf der iPhone 5-Serie unter iOS7 wird keine Speicherwarnung angezeigt.

DevC
quelle
-5

Ändern

[self presentViewController:imagePicker animated:YES completion:nil];

zu

[self presentViewController:imagePicker animated:YES completion:NULL];

Das Problem wurde für mich behoben.

Yuki
quelle