Errore UIImagePickerController: l'istantanea di una vista di cui non è stato eseguito il rendering produce un'istantanea vuota in iOS 7


103

Ricevo questo errore solo in iOS 7 e l'applicazione si è bloccata. In iOS 6, non ricevo mai alcun errore, solo una volta l'avviso di memoria all'apertura della fotocamera.

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.

Ecco cosa sto facendo.

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

[self presentModalViewController:imagePicker animated:YES];

Ho provato a ritardare il presentModalViewController, ma ricevo ancora lo stesso messaggio. Dopo pochi secondi (7-10), l'applicazione si è bloccata.

Questo errore è presente solo in iOS 7.

Qualcuno ha l'indizio?


3
Ho lo stesso problema. Su iOS7 UIIMagePickerController non funziona più.
condor304

Chiamare questo metodo ha funzionato per me. Posizionalo dopo aver presentato la tua vista. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Risposte:


32

Il problema in iOS7 ha a che fare con le transizioni. Sembra che se una transizione precedente non è stata completata e ne avvi una nuova, iOS7 rovina le visualizzazioni, dove iOS6 sembra gestirla correttamente.

Dovresti inizializzare la videocamera nel tuo UIViewController, solo dopo che la vista è stata caricata e con un timeout:

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

ed ecco il codice di inizializzazione

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

    [self presentModalViewController:imagePicker animated:YES];
}

1
Finora sembra funzionare, l'ho testato scattando 10 foto una dopo l'altra senza problemi.
DevC

3
presentModalViewController è stato deprecato in iOS 6. Si suggerisce di utilizzare presentViewController ora.
Gallymon

5
Lo stesso problema e la stessa soluzione per iOS8.
Yauheni Shauchenka

1
Sto cercando di farlo funzionare da un UIAertControl - un'opzione è presentare il selettore di immagini per il browser di foto - funziona bene e l'altra è per presentare per la fotocamera - questo no. Dove dovrei costruire il ritardo durante l'uso un UIALertController?
SimonTheDiver

3
Non inizializzo la fotocamera in viewDidAppear / Load. Ho una vista da tavolo e apro la fotocamera in risposta a una delle scelte di visualizzazione da tavolo. E ricevo questo messaggio di errore. Qualche idea?
Henning

18

Questo errore si è verificato anche per me con il progetto di codice di esempio PhotoPicker di Apple.

Stavo usando Xcode versione 5.0 e iOS 7.0.3 su un iPhone 4.

Passaggi per riprodurre:

  1. Scarica il progetto di esempio PhotoPicker di Apple su https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. In APLViewController.m commentare la riga 125

    //imagePickerController.showsCameraControls = NO;

  3. In APLViewController.m commentare le righe 130-133

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

  4. Crea e avvia l'app.

  5. Una volta avviato, ruota il dispositivo in modalità orizzontale.

  6. Fare clic sull'icona Fotocamera per aprire UIImagePickerController in modalità Fotocamera.

  7. Visualizza l'output della console.

Uscita console

PhotoPicker [240: 60b] L'istantanea di una vista di cui non è stato eseguito il rendering produce un'istantanea vuota. Assicurati che la visualizzazione sia stata renderizzata almeno una volta prima di eseguire l'istantanea o l'istantanea dopo gli aggiornamenti dello schermo.

showsCameraControls proprietà

Il problema si verifica per me quando questo ha un valore di YES (l'impostazione predefinita).

Impostandolo su NO si eliminava il messaggio.

Riportare un errore

Ho appena presentato una segnalazione di bug ad Apple.

Ho provato molti dei suggerimenti che sono stati fatti in diversi post, ma non ho trovato una soluzione soddisfacente.


1
Come ti ha risposto Apple? Ho lo stesso problema e le soluzioni in StackOverflow non funzionano.
heekyu

Non ho ancora notizie di Apple su questo. Pubblicherò una risposta se ricevo una risposta da loro.
Scott Carter

Qualche notizia da Apple? @ScottCarter
Benjamin Toueg

1
Ho appena controllato di nuovo. Nessuna azione sul bug aperto da quando è stato presentato il 2 novembre 2013.
Scott Carter

Questo è il bug 15377241 su bugreport.apple.com
Scott Carter

11

Ho riscontrato il problema quando ho provato a presentare la vista della telecamera all'interno di un popover. In iOS6 questo non era un problema, ma in iOS7 ho ricevuto il messaggio

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.

anche.

Tuttavia, dopo aver modificato la presentazione della vista della fotocamera a schermo intero come descritto in Scattare foto e filmati, iOS Developer Library, tutto è andato di nuovo a posto e il messaggio non è più apparso. Tuttavia, dovevo assicurarmi che, a seconda della modalità in cui si trova l'app (ovvero, presentando la vista della fotocamera o il rullino fotografico), dovevo chiudere il popover o il controller della vista ogni volta che - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerveniva chiamato il metodo .


3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; per me va bene. È l'unica cosa che ha avuto successo qui. Grazie!
daveMac

2
Finalmente! Ho avuto questo problema molte volte e non ho mai trovato una buona soluzione. Ti senti così stupido ora per non aver mai guardato più in basso nei thread delle domande - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; ha risolto questo per me. Questa dovrebbe essere la risposta accettata :)
woobione

6

creare una proprietà

@property (nonatomic) UIImagePickerController *imagePickerController;

Poi

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];

Questo dovrebbe risolvere il problema


3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; ha fatto la differenza per me.
Sig. Berna

1
Funziona la prima volta che viene presentato il selettore, ma dopo che l'avviso ritorna.
daveMac

confermo picker.modalPresentationStyle = UIModalPresentationCurrentContext; Risolve per me il problema dei layout errati in iOS 8
João Nunes

Non funziona per me - aggiunto questo a un'azione UIButton su iOS 8.1.3
Andy

Questo sembrava promettente, ma non ha fatto nulla per me per il problema dell'istantanea E ha mostrato una cornice inutile attorno a una parte dell'immagine dopo che è stata scattata una foto.
ha disegnato ..

4

Ho usato questo codice per risolvere il problema:

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

1
Sebbene l'idea funzioni in teoria, sfortunatamente i controlli mostrati non funzionano o vengono visualizzati correttamente.
daveMac

E non ha eliminato l'avvertimento (almeno per me)
Ege Akpinar

3

Ho lo stesso problema e ho trovato una soluzione. Penso che l'errore sia correlato all'orientamento della tua applicazione. La mia applicazione utilizza solo la modalità orizzontale, ma UIImagePickerController utilizza la modalità verticale. Aggiungo il blocco try-catch a main.m e ottengo un'eccezione reale:

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

Come risolvo questo problema:

1) Ricontrolla l'orientamento del dispositivo in Destinazione-> Generale o file .plist: Orientamenti dell'interfaccia supportati: Orizzontale a sinistra, Orizzontale a destra.

2) Aggiungi in AppDelegate.m:

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

Dopo questo passaggio UIImagePickerController funziona correttamente, ma i miei viewcontroller possono essere ruotati in modalità verticale. Quindi, per risolvere questo problema:

3) Crea una categoria per UINavigationController, (supportedInterfaceOrientations spostato da UIViewController a UINavigationController in iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Questa soluzione funziona correttamente su iOS 6.0, 6.1, 7.0. Spero che questo ti aiuti.


1
Sto sistemando un'app in modalità verticale che fornisce l'errore menzionato in OP. Quindi sembrerebbe che la tua soluzione non sia universalmente applicabile.
JohnK

Hai provato ad aggiungere il blocco try-catch a main.m e stampare l'eccezione e lo stacktrace?
Roman Ermolov

Come questo ?
JohnK,

@ JohnK sì, in questo modo.
Roman Ermolov

3

Ricevo questo errore durante la creazione di un'app con iOS SDK 6.1, destinazione di distribuzione iOS 6.1 e app in esecuzione su iPhone con iOS 7. L'app non si blocca, ma l'implementazione del UIViewController shouldAutorotatemetodo mi aiuta a rimuovere il messaggio di errore.

- (BOOL)shouldAutorotate {
    return YES;
}

3

Ho avuto lo stesso problema quando stavo cercando di modificare l'app demo fornita con Avirary SDK , nell'app demo, può solo modificare la foto selezionata dal rullino fotografico. Per provare a modificare la foto acquisendola dalla fotocamera, ho prima aggiunto il seguente codice nel file UIViewcontroller.m:

#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];
        }
    }
}

Quindi, quando eseguo l'app, si è verificato l'errore:

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.

Per risolvere l'errore, modifica il delegato UIImagePicker nel file UIViewContooler.m come mostrato di seguito:

#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];
    }

}    

Quindi l'errore è scomparso e l'app funziona!


1

Prova questo, usa

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

e funzione

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

Rimpiazzare. [self presentModalViewController:imagePicker animated:YES]; e di causa make imagePickercome variabile globale.


1

Questo è ciò che mi ha risolto sulla mia app, ymmv

prima di tutto è un'app per iPhone - iPad

in appname-Info.plist. negli orientamenti dell'interfaccia supportata (iPad) mostrava 4 orientamenti.

Nell'interfaccia supportata gli orientamenti mostravano 3 orientamenti. Ho aggiunto il quarto e ho eseguito l'app, nessun output di debug.

Spero che questo ti aiuti.


0

Ho appena riscontrato lo stesso problema. Nel mio caso il problema era che avevo un codice non ARC e l'ho migrato ad ARC. Quando ho eseguito la migrazione, non ho tenuto un forte riferimento a UIImagePickerControllere questo è stato il motivo del crash.

Spero che sia d'aiuto :)


0

Ho avuto lo stesso problema in iOS 8, ma l'accesso alla fotocamera era disabilitato in Impostazioni -> Privacy per la mia app. L'ho appena abilitato e funzionava.


0

Ho passato molto tempo a cercare la soluzione, e sorprendentemente alla fine l'ho trovata ed è stato molto divertente una volta scoperta.

Ecco cosa farai per recuperare l'immagine che hai scelto e riprendere a lavorare :)

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

Sì, per risolvere il problema, devi solo chiudere il selettore normalmente perché sembra questo messaggio: "L'istantanea di una vista che non è stata sottoposta a rendering risulta in un'istantanea vuota. Assicurati che la tua vista sia stata renderizzata almeno una volta prima dell'istantanea o dell'istantanea dopo aggiornamenti dello schermo. " impedisce al selettore di essere reattivo ma puoi ignorarlo e recuperare l'immagine normalmente.


0

Nel mio caso si trattava di una modifica del layout: il VC che presenta il UIImagePickerViewControllerha la barra di stato nascosta, ma ilUIImagePickerViewController ha.

Quindi, l'ho risolto nascondendo la barra di stato UIImagePickerViewControllercome mostrato in questa risposta .


-1

Non rispondendo direttamente alla tua domanda ma hai menzionato che avevi un avviso di memoria, potresti memorizzare l'immagine grezza in una proprietà che può portare a un avviso di memoria. Questo perché l'immagine grezza occupa circa 30 MB di memoria. Ho notato un avviso di memoria simile durante il test delle app su iOS6 che erano sulla serie iPhone 4. Ho ancora ricevuto questo avviso quando i dispositivi sono stati aggiornati a iOS7. Non ci sono avvisi sulla memoria durante il test su iPhone serie 5 su iOS7.


-5

Mutevole

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

per

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

risolto il problema per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.