Quero converter um UIView em uma imagem e salvá-lo em meu aplicativo. Alguém pode me dizer como fazer uma captura de tela de uma visualização ou convertê-la em uma imagem e qual é a melhor maneira de salvá-la em um aplicativo (não o rolo da câmera)? Aqui está o código para a visualização:
var overView = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)
ios
swift
uiview
screenshot
Sameer Hussain
fonte
fonte
Respostas:
Uma extensão em
UIView
deve resolver o problema.A Apple desencoraja o uso do
UIGraphicsBeginImageContext
iOS 10 com a introdução da gama de cores P3.UIGraphicsBeginImageContext
é sRGB e apenas 32 bits. Eles introduziram a novaUIGraphicsImageRenderer
API que é totalmente gerenciada por cores, baseada em blocos, tem subclasses para PDFs e imagens e gerencia automaticamente o tempo de vida do contexto. Confira a sessão 205 do WWDC16 para obter mais detalhes (a renderização da imagem começa em torno da marca de 11:50)Para ter certeza de que funciona em todos os dispositivos, use
#available
com um substituto para versões anteriores do iOS:fonte
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
você pode usar extensão
Aqui está a versão 3/4 rápida:
fonte
let image = UIImage(view: myView)
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
Converta seu UIView em imagem por drawViewHierarchyInRect: afterScreenUpdates: que é muitas vezes mais rápido que renderInContext
Observação importante: não chame esta função de viewDidLoad ou viewWillAppear , certifique-se de capturar uma visualização depois que ela for exibida / carregada totalmente
Obj C
Salve o álbum de fotos da imagem editada
Swift 3/4
Generalização super fácil com extensão, iOS11, swift3 / 4
fonte
No iOS 10:
fonte
Prática recomendada a partir do iOS 10 e Swift 3
embora ainda suporte iOS 9 e anteriores, ainda funciona a partir do iOS 13, Xcode 11.1, Swift 5.1
Não tenho certeza do que a pergunta significa por:
fonte
fonte
Por exemplo, se eu tiver uma visão de tamanho: 50 50 em 100.100. Posso usar o seguinte para fazer uma captura de tela:
fonte
Na minha opinião, a abordagem com o inicializador não é tão boa porque ele cria duas imagens.
Eu prefiro isso:
fonte
Swift 4.2, iOS 10
Amostra
fonte
Isso funciona para mim para Xcode 9 / Swift 3.2 / Swift 4 e Xcode 8 / Swift 3
Veja como usá-lo dentro de uma função:
Veja como fazer algo com a imagem retornada da função:
Recebi a resposta do Xcode 9 / Swift 3.2 / Swift 4 de Paul Hudson convert uiview para uiimage
Peguei o Xcode 8 / Swift 3 em algum lugar do SO, há muito tempo e esqueci onde :(
fonte
ou no objetivo-c
fonte
Você pode usá-lo facilmente usando a extensão como esta
Se você quiser usar esses métodos / variáveis de extensão, implemente este
Extensão UIImage
Extensão UIView
Extensão UIApplication
fonte
ou iOS 10+ você pode usar o novo UIGraphicsImageRenderer + o drawHierarchy recomendado, que em algumas situações pode ser muito mais rápido do que layer.renderInContext
fonte
Obrigado @Bao Tuan Diep! Eu quero adicionar um suplemento.
Quando você usa o código:
Você deve notar que:
Então, você deve usar :
para atualizar
yourView
antesyourView.layer.render(in:UIGraphicsGetCurrentContext()!)
.Caso contrário, você pode obter um objeto de imagem que não contém elementos
fonte
Swift 4.2
fonte
Implementação em Swift 3 :
Adicione o código abaixo, fora do escopo da classe.
Uso:
fonte
Implementei @Naveed J. o método de assim, e funcionou .
Aqui estava sua extensão:
Aqui está como eu o implementei.
fonte
Inicializador com o novo UIGraphicsImageRenderer disponível desde iOS 10:
fonte
funciona bem comigo!
Swift4
fonte
return snapshotImageFromMyView!
Tópico 1: Erro fatal: Inesperadamente encontrado nulo ao desembrulhar um valor opcionalPara a visualização contém subvisualização desfocada (por exemplo, instância UIVisualEffectView ), apenas drawViewHierarchyInRect: afterScreenUpdates funciona.
A resposta de @ViJay Avhad está correta para este caso.
fonte
fonte