SWIFT – Acesse a câmera do iOS e a biblioteca de fotos

Uma solução de copiar e colar feita em Swift

Dejan Atanasov 1º de novembro de 2017

O acesso à câmera do iOS e à biblioteca de fotos talvez seja um dos recursos mais comuns que você pode encontrar em quase todos os aplicativos que criamos. É por isso que temos que nos certificar de que o fazemos corretamente e que temos uma classe personalizada pronta para ser reutilizada a qualquer momento.

Neste tutorial, mostrarei como criar a classe personalizada no Swift e tê-la em sua mão sempre que precisar. Se você está com preguiça de ler todo o tutorial, você tem um arquivo GIST no final deste post que você pode baixar. Vou nomear a classe CameraHandler.swift.

Acesse a câmera do iOS e a biblioteca de fotos

Começarei criando duas funções, a primeira será nomeada camera () e a segunda, photoLibrary (). Estamos usando a classe UIImagePickerController para ambos os casos, e tudo o que precisamos fazer é alterar a propriedade sourceType para a adequada.

Câmera()

 func camera() 
{
if UIImagePickerController.isSourceTypeAvailable(.camera){
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .camera
currentVC.present(myPickerController, animated: true, completion: nil)
}

}

biblioteca de fotos()

 func photoLibrary() 
{

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .photoLibrary
currentVC.present(myPickerController, animated: true, completion: nil)
}
}

Como você pode ver, as mudanças SourceType para .A câmara e tipos .photoLibrary. Nós precisaremos do UIImagePickerControllerDelegate e do UINavigationControllerDelegate para que possamos interceptar a imagem escolhida pelo usuário. Vou explicar abaixo sobre a propriedade currentVC .

Create UIActionSheet

Em seguida, o que vamos fazer é criar uma função que irá apresentar as duas opções para o usuário em um simples UIActionSheet .

showActionSheet ()

 func showActionSheet(vc: UIViewController) { 
currentVC = vc
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.camera()
}))

actionSheet.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.photoLibrary()
}))

actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

vc.present(actionSheet, animated: true, completion: nil)
}

Essa é a única função que você precisará chamar para mostrar a Câmera do iOS e a Biblioteca de fotos. Está mostrando um simples UIActionSheet com as duas opções disponíveis. Além disso, estamos passando um parâmetro chamado vc que será passado para a propriedade privada currentVC . Estamos fazendo isso para lidar com a apresentação dos controladores diretamente de dentro da classe.

NOTA: Se o dispositivo não suportar câmera ou biblioteca de fotos, nada acontecerá quando você pressionar uma opção. Por exemplo, testando o recurso da câmera no simulador.

Delegar métodos

No final do arquivo, criaremos uma extensão e chamaremos os métodos delegados didFinishPickingMediaInfo e imagePickerControllerDidCancel que pertencem ao UIImagePickerControllerDelegate.

 extension CameraHandler: UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
currentVC.dismiss(animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
self.imagePickedBlock?(image)
}else{
print("Something went wrong")
}
currentVC.dismiss(animated: true, completion: nil)
}
}

Agora podemos obter a imagem escolhida da fototeca ou a foto capturada da câmera. Para tornar as coisas mais simples e claras, criei um fechamento chamado imagePickedBlock () que nos fornecerá a imagem escolhida onde precisamos dela. Aqui estão todas as propriedades que você precisa.

 static let shared = CameraHandler() 

fileprivate var currentVC: UIViewController!

//MARK: Internal Properties
var imagePickedBlock: ((UIImage) -> Void)?

Como usar?

Nós terminamos de criar a turma agora precisamos usá-la. A beleza em classes como esta é a fácil reutilização.

 CameraHandler.shared.showActionSheet(vc: self) 
CameraHandler.shared.imagePickedBlock = { (image) in
/* get your image here */
}

É isso a partir deste tutorial que mostrou como acessar o iOS Camera e Photo Library no Swift 3, e eu realmente espero que tenha ajudado você. Por favor, compartilhe esta postagem como um suporte ou comentário na seção de comentários para quaisquer dúvidas que você possa ter.

Arquivo GIST completo