iOS 8 Snapshot di una vista che non ha restituito risultati in un’istantanea vuota

In iOS 8 ho problemi nel catturare immagini dalla fotocamera fino ad ora per cui sto usando questo codice

UIImagePickerController *controller=[[UIImagePickerController alloc] init]; controller.videoQuality=UIImagePickerControllerQualityTypeMedium; controller.delegate=(id)self; controller.sourceType=UIImagePickerControllerSourceTypeCamera; [self presentViewController:controller animated:YES completion:nil]; 

Ma in iOS 8 ho capito:

 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. 

Ho provato con la soluzione fornita da questo post con

 @property (strong,nonatomic)UIImagePickerController *controller; _controller=[[UIImagePickerController alloc] init]; _controller.videoQuality=UIImagePickerControllerQualityTypeMedium; _controller.delegate=(id)self; _controller.sourceType=UIImagePickerControllerSourceTypeCamera; _[self presentViewController:controller animated:YES completion:nil]; 

e questo

 ... controller.modalPresentationStyle=UIModalPresentationFullScreen; or controller.modalPresentationStyle=UIModalPresentationCurrentContext; ... 

e questo

 double delayInSeconds = 0.1; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self presentViewController:controller animated:YES completion:nil]; }); 

e questo

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

e questo

 [self presentViewController:controller animated:YES completion:^{ }]; 

qualche idea?

Sono abbastanza sicuro che questo è solo un bug in iOS 8.0. È riproducibile con la più semplice delle app POC che non fa altro che tentare di presentare un UIImagePickerController come si fa sopra. Inoltre, per quanto ne so, non esiste un modello alternativo per visualizzare il selettore di immagini / fotocamera. È anche ansible scaricare l’ app di esempio Usando UIImagePickerController di Apple, eseguirla e genererà lo stesso errore immediatamente .

Detto questo, la funzionalità funziona ancora per me. A parte l’avviso / errore, hai problemi con il funzionamento della tua app?

Ero alle prese con questo problema per diverse ore, ho letto ogni argomento pertinente e ho scoperto che l’errore era causato dal fatto che, in base alle impostazioni sulla privacy del mio dispositivo, l’accesso della fotocamera alla mia app era bloccato !!! Non ho mai negato l’accesso alla videocamera e non so come sia stato bloccato, ma quello era il problema!

Non ho abbastanza punti reputazione per commentare la risposta di @ greg sopra, quindi aggiungerò qui le mie osservazioni. Ho un progetto Swift per iPad e iPhone. Ho un metodo all’interno del mio controller di visualizzazione principale (un bit rilevante sotto). Quando eseguo il test su un telefono, tutto funziona correttamente e non vengono generati avvisi. Quando lo eseguo su un iPad, tutto funziona correttamente, ma vedo l’avviso relativo all’istantanea della vista. Il bit interessante, tuttavia, è che quando corro su un iPad senza usare il controller popover, tutto funziona correttamente senza preavviso. Sfortunatamente, Apple impone che il selettore di immagini debba essere utilizzato all’interno di un popover su iPad, se la fotocamera non viene utilizzata.

  dispatch_async(dispatch_get_main_queue(), { let imagePicker: UIImagePickerController = UIImagePickerController(); imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum; imagePicker.mediaTypes = [kUTTypeImage]; imagePicker.allowsEditing = false; imagePicker.delegate = self; if(UIDevice.currentDevice().userInterfaceIdiom == .Pad){ // on a tablet, the image picker is supposed to be in a popover let popRect: CGRect = buttonRect; let popover: UIPopoverController = UIPopoverController(contentViewController: imagePicker); popover.presentPopoverFromRect(popRect, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true); }else{ self.presentViewController(imagePicker, animated: true, completion: nil); } }); 

Mi sono imbattuto in questo dopo aver chiamato UIImagePickerController presentViewController: dalla richiamata a un delegato UIAlertView. Ho risolto il problema spingendo il presentViewController: richiama la traccia di esecuzione corrente usando dispatch_async.

 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { dispatch_async(dispatch_get_main_queue(), ^{ UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.delegate = self; if (buttonIndex == 1) imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; else imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController: imagePickerController animated: YES completion: nil]; }); } 

Ho riscontrato questo problema durante l’animazione di alcune visualizzazioni e l’app passava in modalità background e torna indietro. L’ho gestito impostando una flag isActive. L’ho impostato su NO in

 - (void)applicationWillResignActive:(UIApplication *)application 

e SÌ dentro

 - (void)applicationDidBecomeActive:(UIApplication *)application 

e animare o non animare di conseguenza le mie opinioni. Prendersi cura del problema.

Ho avuto questo con un UIAlertControllerStyleActionSheet dando all’utente la possibilità di scattare una foto con la fotocamera o usarne una dalla libreria.

Ho provato un punto di interruzione simbolico sul messaggio di errore inserisci la descrizione dell'immagine qui

Ciò mi ha mostrato che l’errore è prodotto dall’uso interno di UICollectionView durante la presentazione

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

inserisci la descrizione dell'immagine qui

Ho risolto questo problema impostando explixitly la cornice prima della presentazione

 [alert setPreferredContentSize: alert.view.frame.size]; 

Ecco il metodo completo che funziona senza errori

 -(void)showImageSourceAlertFromSender:(id)sender{ UIButton *senderButton = (UIButton*)sender; UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self takePhoto]; }]; UIAlertAction *libraryAction = [UIAlertAction actionWithTitle:@"Library" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self selectPhotoFromLibraryFromSender:sender]; }]; [alert addAction:cameraAction]; [alert addAction:libraryAction]; alert.popoverPresentationController.delegate = self; alert.popoverPresentationController.sourceRect = senderButton.frame; alert.popoverPresentationController.sourceView = self.view; [alert setPreferredContentSize: alert.view.frame.size]; [self presentViewController:alert animated:YES completion:^(){ }];} 

È ansible distriggersre l’avviso “Esecuzione istantanea di una vista” facendo riferimento alla proprietà della view prima di presentare il controller della vista. In questo modo, la vista viene caricata e consente a iOS di eseguirne il rendering prima di scattare l’istantanea.

 UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; controller.modalPresentationStyle = UIModalPresentationPopover; controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender; ... setup the UIAlertController ... [controller view]; // <--- Add to silence the warning. [self presentViewController:controller animated:YES completion:nil]; 

Per chiunque stia vedendo un problema con un’anteprima nera dopo l’acquisizione dell’immagine, hide la barra di stato dopo che UIPickerController è stato mostrato sembra risolvere il problema.

 UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; UIImagePickerController *cameraController = [[UIImagePickerController alloc] init]; cameraController.delegate = self; cameraController.sourceType = source; cameraController.allowsEditing = YES; [self presentViewController:cameraController animated:YES completion:^{ //iOS 8 bug. the status bar will sometimes not be hidden after the camera is displayed, which causes the preview after an image is captured to be black if (source == UIImagePickerControllerSourceTypeCamera) { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; } }]; 

Ho trovato lo stesso problema e ho provato tutto. Ho due app diverse, una in objective-C e una in swift – entrambe hanno lo stesso problema. Il messaggio di errore arriva nel debugger e lo schermo diventa nero dopo la prima foto. Questo succede solo in iOS> = 8.0, ovviamente è un bug.

Ho trovato una soluzione difficile. Spegni i controlli della videocamera con imagePicker.showsCameraControls = false e crea il tuo overlayView con i pulsanti mancanti. Ci sono vari tutorial su come farlo. Lo strano messaggio di errore rimane, ma almeno lo schermo non diventa nero e hai un’app funzionante.

Questo potrebbe essere un bug di ImagePickerController incorporato. Il mio codice funziona, ma occasionalmente si blocca su iPhone 6 Plus.

Ho provato tutte le soluzioni suggerite da altre risposte ma non ci sono state fortuna. Problema finalmente risolto dopo il passaggio a JPSImagePickerController .

Ho provato di tutto, il mio problema era che il selettore di immagini per la fotocamera e la libreria di foto scomparivano subito dopo la loro visualizzazione. L’ho risolto con la seguente riga (rapida)

 imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

Sono abbastanza sicuro che questo è solo un bug in iOS 8.0. È riproducibile con la più semplice delle app POC che non fa altro che tentare di presentare un UIImagePickerController come si fa sopra. Inoltre, per quanto ne so, non esiste un modello alternativo per visualizzare il selettore di immagini / fotocamera. È anche ansible scaricare l’app di esempio Usando UIImagePickerController di Apple, eseguirla e genererà lo stesso errore immediatamente.

Detto questo, la funzionalità funziona ancora per me. A parte l’avviso / errore, hai problemi con il funzionamento della tua app?

Se utilizziamo UIImagePickerController come proprietà, questo avviso scomparirà. xcode presuppone che non stiamo usando il risultato di UIImagePickerController , se stiamo istanziando UIImagePickerController all’interno di una funzione.

Chiamare questo metodo ha funzionato per me. Posizionalo dopo aver presentato la tua vista.

 [yourViewBeingPresented.view layoutIfNeeded]; 

Incontro anche lo stesso problema e l’ho risolto controllando che la fotocamera sia disponibile:

 BOOL cameraAvailableFlag = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; if (cameraAvailableFlag) [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3]; 

Mi sono imbattuto in questo problema. Quando chiamiamo la fotocamera e rilasciamo le viste abbiamo prodotto questo problema. Per un esempio chiama una telecamera e imposta la vista nil nel metodo viewDidDisappear questo errore arriverà dato che non c’è callback per l’evento camera. Assicurati anche di questo caso per questo errore.

Ho avuto lo stesso bug, ricevendo un messaggio muggito in console mentre aprivo la fotocamera.

‘Snapshotting di una vista che non è stata sottoposta a rendering in un’istantanea vuota. Assicurati che la tua vista sia stata renderizzata almeno una volta prima dell’istantanea o dello snapshot dopo gli aggiornamenti dello schermo. ‘

Per me il problema era con il nome del display Bundle in Info.plist file.it era vuoto come, ho messo il mio nome app lì e ora funziona bene.non ho ricevuto alcun avviso di authorization della fotocamera a causa del display Bundle vuoto name.it bloccato la vista dal rendering.

il problema non era visibile ma presentandolo senza authorization. Puoi verificarlo nelle impostazioni -> privacy -> Fotocamera, se la tua app non è elencata il problema potrebbe essere lo stesso.

Sto usando PhoneGap, ma questo thread continua a venire come il primo quando Googling sul messaggio di errore.

Per me questo problema è andato via definendo l’imagetype in PNG.

 encodingType : Camera.EncodingType.PNG 

Quindi l’intera linea è:

  navigator.camera.getPicture(successFunction, failFunction, { encodingType : Camera.EncodingType.PNG, correctOrientation:true, sourceType : Camera.PictureSourceType .PHOTOLIBRARY, quality: 70, allowEdit : false , destinationType: Camera.DestinationType.DATA_URL}); 

Il tuo chilometraggio può variare, ma questo ha fatto il trucco per me.

In alternativa, considera l’uso di drawViewHierarchyInRect :

Swift:

 extension UIImage{ class func renderUIViewToImage(viewToBeRendered: UIView) -> UIImage { UIGraphicsBeginImageContextWithOptions(viewToBeRendered.bounds.size, true, 0.0) viewToBeRendered.drawViewHierarchyInRect(viewToBeRendered.bounds, afterScreenUpdates: true) viewToBeRendered.layer.renderInContext(UIGraphicsGetCurrentContext()!) let finalImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } } 

Objective-C:

 - (UIImage *)snapshot:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0); [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Vedi anche:

Nel mio caso (XCode 7 e iOS 9), uso UINavigationController “hidden”, quindi devo aggiungere UINavigationControllerDelegate per presentare camera o roll e funziona come dovrebbe! And pickerControllerDelegate.self non visualizza neanche l’errore!