Gostaria de saber como meu aplicativo para iPhone pode tirar uma captura de tela de um específico UIView
como um UIImage
.
Eu tentei esse código, mas tudo o que recebo é uma imagem em branco.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
tem dimensões de 320 x 480 e possui algumas sub-visualizações. Qual é a maneira correta de fazer isso?
ios
objective-c
uiview
screenshot
cduck
fonte
fonte
Respostas:
Eu acho que você pode querer
renderInContext
, nãodrawInContext
. drawInContext é mais um método que você substituiria ...Observe que ele pode não funcionar em todas as visualizações, especificamente um ano atrás, quando tentei usar isso com a visualização da câmera ao vivo, não funcionou.
fonte
O iOS 7 possui um novo método que permite desenhar uma hierarquia de visualizações no contexto gráfico atual. Isso pode ser usado para obter uma UIImage muito rápido.
Eu implementei um método de categoria
UIView
para obter a visualização comoUIImage
:É consideravelmente mais rápido que o
renderInContext:
método existente .Referência: https://developer.apple.com/library/content/qa/qa1817/_index.html
ATUALIZAÇÃO PARA SWIFT : uma extensão que faz o mesmo:
ATUALIZAÇÃO PARA SWIFT 3
fonte
Você precisa capturar a janela da chave para uma captura de tela ou um UIView. Você pode fazer isso na resolução Retina usando UIGraphicsBeginImageContextWithOptions e defina seu parâmetro de escala 0.0f. Ele sempre captura em resolução nativa (retina para iPhone 4 e posterior).
Este faz uma captura de tela em tela cheia (janela principal)
Este código captura um UIView em resolução nativa
Isso salva a UIImage no formato jpg com 95% de qualidade na pasta de documentos do aplicativo, se você precisar fazer isso.
fonte
iOS7 em diante, temos os métodos padrão abaixo:
Chamar o método acima é mais rápido do que tentar renderizar o conteúdo da visualização atual em uma imagem de bitmap.
Se você deseja aplicar um efeito gráfico, como desfoque, a um instantâneo, use o
drawViewHierarchyInRect:afterScreenUpdates:
método.https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
fonte
Há uma nova API do iOS 10
fonte
Eu criei uma extensão utilizável para o UIView fazer a captura de tela no Swift:
Para usá-lo, basta digitar:
fonte
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0);
vez deUIGraphicsBeginImageContext(self.bounds.size);
usar o fator de escala correto do dispositivo.drawViewHierarchyInRect
vez derenderInContext
não.Este método pode colocar na sua classe Controller.
fonte
drawRect
é não parte do UIViewController (IIRC). Faz parte de um UIView. Eu não acredito que será chamado se estiver no controlador.A Apple agora nos permite usá-lo em um aplicativo público, mesmo que seja uma API privada
fonte
Detalhes
Solução
Uso
Amostra completa
Resultado
fonte
A Apple não permite:
Os aplicativos devem fazer uma captura de tela usando o
drawRect
método especificado em: http://developer.apple.com/library/ios/#qa/qa2010/qa1703.htmlfonte
Eu criei esta extensão para salvar uma captura de tela do UIView
ligar para :
Se você deseja criar um png, deve alterar:
de
fonte
Swift 4 atualizado:
fonte
O seguinte trecho é usado para fazer a captura de tela:
Use
renderInContext:
método em vez dedrawInContext:
métodorenderInContext:
O método renderiza o receptor e suas subcamadas no contexto atual. Este método é renderizado diretamente da árvore de camadas.fonte
fonte
você pode usar a seguinte categoria UIView -
fonte