iOS 8 Capturar instantaneamente uma visualização que não foi renderizada resulta em um instantâneo vazio

No iOS 8 eu estou tendo problemas para capturar imagens da câmera até agora eu estou usando este código para

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

Mas no iOS 8 estou recebendo isso:

 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. 

Eu tentei com a solução fornecida por este Post com

 @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 isto

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

e isto

 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 isto

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

e isto

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

qualquer ideia?

Tenho certeza que isso é apenas um bug no iOS 8.0. É reproduzível com o mais simples dos aplicativos POC que não faz mais do que tentar apresentar um UIImagePickerController como você está fazendo acima. Além disso, não há nenhum padrão alternativo para exibir o selecionador de imagens / câmera, que eu saiba. Você pode até mesmo baixar o aplicativo de amostra Apple UIImagePickerController , executá-lo, e ele irá gerar o mesmo erro fora da checkbox.

Dito isto, a funcionalidade ainda funciona para mim. Além do aviso / erro, você tem problemas com o funcionamento do seu aplicativo?

Eu estava lutando com esse problema por várias horas, eu li todos os tópicos relevantes e descobri que o erro foi causado porque sob as configurações de privacidade do meu dispositivo, o access da câmera ao meu aplicativo foi bloqueado! Eu nunca neguei o access à câmera e não sei como ela foi bloqueada, mas esse era o problema!

Eu não tenho pontos de reputação suficientes para comentar a resposta do @greg acima, então adicionarei minhas observações aqui. Eu tenho um projeto Swift para iPad e iPhone. Eu tenho um método dentro do meu controlador de visualização principal (bit relevante abaixo). Quando eu testo isso em um telefone, tudo funciona corretamente e nenhum aviso é gerado. Quando eu o executo em um iPad, tudo funciona corretamente, mas vejo o aviso sobre a captura instantânea da exibição. A parte interessante, no entanto, é que quando eu corro em um iPad sem usar o controlador de popover, tudo funciona corretamente sem nenhum aviso. Infelizmente, a Apple exige que o seletor de imagens seja usado em um popover no iPad, caso a câmera não esteja sendo usada.

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

Eu corri para isso depois de chamar UIImagePickerController presentViewController: a partir do retorno de chamada para um delegado UIAlertView. Eu resolvi o problema, empurrando o presentViewController: chamar o rastreamento de execução atual 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]; }); } 

Eu tive esse problema ao animar algumas visualizações e o aplicativo entraria no modo de segundo plano e voltaria. Eu segurei isso definindo um sinalizador isActive. Eu configurei para NO em

 - (void)applicationWillResignActive:(UIApplication *)application 

e SIM em

 - (void)applicationDidBecomeActive:(UIApplication *)application 

e animar ou não animar minhas visualizações de acordo. Tomou conta da questão.

Eu tive isso com um UIAlertControllerStyleActionSheet dando ao usuário a opção de tirar uma foto com a câmera ou usar um da biblioteca.

Eu tentei um ponto de interrupção simbólico na mensagem de erro insira a descrição da imagem aqui

Isso me mostrou que o erro é produzido pelo uso interno de um UICollectionView durante a apresentação

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

insira a descrição da imagem aqui

Eu consertei isso definindo explicitamente o quadro antes de apresentar

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

Aqui está o methode completo que está funcionando sem o erro

 -(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:^(){ }];} 

Você pode silenciar o aviso “Captura instantânea de uma vista” referenciando a propriedade da view antes de apresentar o controlador de visualização. Isso faz com que a visualização seja carregada e permite que o iOS a renderize antes de tirar a foto.

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

Para qualquer um que esteja vendo um problema com uma visualização em preto após a captura da imagem, ocultar a barra de status após a exibição do UIPickerController parece corrigir o 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]; } }]; 

Eu encontrei o mesmo problema e tentei de tudo. Eu tenho dois aplicativos diferentes, um no objective-C e um no swift – ambos têm o mesmo problema. A mensagem de erro vem no depurador e a canvas fica preta após a primeira foto. Isso só acontece no iOS> = 8.0, obviamente, é um bug.

Eu encontrei uma solução difícil. Desligue os controles da câmera com imagePicker.showsCameraControls = false e crie seu próprio overlayView que tenha os botões ausentes. Existem vários tutoriais sobre como fazer isso. A estranha mensagem de erro permanece, mas pelo menos a canvas não fica preta e você tem um aplicativo em funcionamento.

Isso pode ser um bug do ImagePickerController interno. Meu código está funcionando, mas ocasionalmente falha no iPhone 6 Plus.

Eu tentei todas as soluções sugeridas por outras respostas, mas não houve sorte. Problema finalmente resolvido depois de mudar para JPSImagePickerController .

Eu tentei de tudo, meu problema era que o seletor de imagens para a câmera e a biblioteca de fotos desapareceu logo depois que eles apareceram. Eu resolvi com a seguinte linha (swift)

 imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

Tenho certeza que isso é apenas um bug no iOS 8.0. É reproduzível com o mais simples dos aplicativos POC que não faz mais do que tentar apresentar um UIImagePickerController como você está fazendo acima. Além disso, não há nenhum padrão alternativo para exibir o selecionador de imagens / câmera, que eu saiba. Você pode até mesmo baixar o aplicativo de amostra Apple UIImagePickerController, executá-lo, e ele irá gerar o mesmo erro fora da checkbox.

Dito isto, a funcionalidade ainda funciona para mim. Além do aviso / erro, você tem problemas com o funcionamento do seu aplicativo?

Se estivermos usando o UIImagePickerController como uma propriedade, esse aviso desaparecerá. O xcode assume que não estamos usando o resultado do UIImagePickerController , se estivermos instanciando o UIImagePickerController dentro de uma function.

Chamar esse método funcionou para mim. Coloque-o depois de apresentar sua visão.

 [yourViewBeingPresented.view layoutIfNeeded]; 

Eu também encontro o mesmo problema e resolvi isso verificando se a câmera está disponível:

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

Eu me deparei com esse problema. Quando ligamos para a câmera e liberamos as visualizações produzidas este problema. Para um exemplo, chamar uma câmera e definir a visualização nil no método viewDidDisappear esse erro ocorrerá, pois não há retorno de chamada para o evento da câmera. Certifique-se sobre este caso também para este erro.

Eu recebi o mesmo bug, recebendo uma mensagem abaixo no console enquanto abria a câmera.

‘Capturar instantaneamente uma exibição que não foi renderizada resulta em um instantâneo vazio. Certifique-se de que sua visualização tenha sido processada pelo menos uma vez antes do snapshot ou snapshot após as atualizações de canvas. ‘

Para mim, o problema era com o nome de exibição do Bundle no arquivo Info.plist.estava vazio de alguma forma, eu coloquei o nome do aplicativo lá e agora está funcionando bem.não recebi nenhum alerta de permissão da câmera por causa do nome de exibição do Bundle vazio.it bloqueou a visualização da renderização.

o problema não estava com a visão, mas apresentando-o sem uma permissão.Você pode verificar isso em configurações -> privacidade -> Câmera, se o seu aplicativo não listado, o problema pode ser o mesmo.

Eu estou usando Phonegap, mas este segmento continua vindo como o primeiro quando pesquisando sobre a mensagem de erro.

Para mim, esse problema desapareceu definindo o tipo de imagem para PNG.

 encodingType : Camera.EncodingType.PNG 

Então toda a linha sendo:

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

Sua milhagem pode variar, mas isso foi o truque para mim.

Como alternativa, considere o uso de drawViewHierarchyInRect :

Rápido:

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

Objetivo-C:

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

Veja também:

No meu caso (XCode 7 e iOS 9), eu uso UINavigationController “hidden”, então eu tenho que adicionar UINavigationControllerDelegate para apresentar camera ou roll e funcionar como deveria! And pickerControllerDelegate.self não exibe erro também!