TransWikia.com

Como anexar imagens da camera ou da galeria em Swift

Stack Overflow em Português Asked by Junior Sanches on February 11, 2021

Bom dia pessoal, estou desenvolvendo uma aplicação em Swift, porém sou novo na linguagem e não sei algumas coisas, gostaria de saber como eu Anexo as imagens da minha galeria ou abro a camera do celular para tirar um foto.

Obrigado desde já.

2 Answers

Opa, blza!? segue o código para fazer essa ação, nativo do ios, nao gasta adicionar lib nenhuma.

import UIKit
import Firebase
import APESuperHUD

class CadastroEleitorViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var txtNome: UITextField!
    var nome: String!
    @IBOutlet weak var txtSobrenome: UITextField!
    var sobrenome: String!
    @IBOutlet weak var txtEmail: UITextField!
    var email: String!
    @IBOutlet weak var txtSenha: UITextField!
    var senha: String!
    @IBOutlet weak var imagemPerfil: UIImageView!
    var imagem : UIImage!

    var mEleitorModel = EleitorModel()
    var ref: DatabaseReference!
    var userID : String!

    override func viewDidLoad() {
        super.viewDidLoad()

        if FirebaseApp.app() == nil {
            FirebaseApp.configure()
        }

        ref = Database.database().reference()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        imagem = info[UIImagePickerControllerOriginalImage] as! UIImage
        imagemPerfil.image = imagem
        imagemPerfil.layer.borderWidth = 1.0
        imagemPerfil.layer.masksToBounds = false
        imagemPerfil.layer.borderColor = UIColor.white.cgColor
        imagemPerfil.layer.cornerRadius = imagemPerfil.frame.size.width / 2
        imagemPerfil.clipsToBounds = true

        dismiss(animated: true, completion: nil)
    }

    @IBAction func botaoTirarFoto(_ sender: Any) {
        capturaFoto()
    }

    override var preferredStatusBarStyle: UIStatusBarStyle{
        return.lightContent // barra de status tema claro
    }

    @IBAction func iconeVoltar(_ sender: Any) {
        navigationController?.popViewController(animated: true)
        dismiss(animated: true, completion: nil)
    }

    @IBAction func botaoCadastrar(_ sender: Any) {

        if validaCampos() {
            FunctionDefault.exibeProgress(mensagem: "Carregando...")
            criaUsuario()
        }
    }


    @IBAction func botaoCadastrarFacebook(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Usuario", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "PagamentoViewController") as UIViewController
        present(vc, animated: true, completion: nil)
    }


    @IBAction func botaoLogin(_ sender: Any) {
        telaLogin()
    }

    func validaCampos() -> Bool {
        nome = txtNome.text?.trimmingCharacters(in: .whitespacesAndNewlines)
        sobrenome = txtSobrenome.text?.trimmingCharacters(in: .whitespacesAndNewlines)
        email = txtEmail.text?.trimmingCharacters(in: .whitespacesAndNewlines)
        senha = txtSenha.text?.trimmingCharacters(in: .whitespacesAndNewlines)

        if nome.isEmpty {
            FunctionDefault.AlertMessage(title: "Alerta", message: "Por favor informe seu nome!", targetVC: self)
            return false
        }

        if sobrenome.isEmpty {
            FunctionDefault.AlertMessage(title: "Alerta", message: "Por favor informe seu sobrenome!", targetVC: self)
            return false
        }

        if email.isEmpty {
            FunctionDefault.AlertMessage(title: "Alerta", message: "Por favor informe seu e-mail!", targetVC: self)
            return false
        }

        if senha.isEmpty {
            FunctionDefault.AlertMessage(title: "Alerta", message: "Por favor informe uma senha!", targetVC: self)
            return false
        }

        if senha.count < 6 {
            FunctionDefault.AlertMessage(title: "Alerta", message: "Senha muito curta, digite no mínimo 6 caracteres!", targetVC: self)
            return false
        }

        if imagem == nil {
            let alert = UIAlertController(title: "Foto do perfil", message: "Vamos adicionar uma foto ao seu perfil para que todos possam te identificar.", preferredStyle: UIAlertControllerStyle.alert)
            alert.addAction(UIAlertAction(title: "Selecionar foto", style: UIAlertActionStyle.default, handler: { (action) in
                self.capturaFoto()
            }))
            self.present(alert, animated: true, completion: nil)
            return false
        }

        return true
    }

    func uploadImage() -> Void {
        let storage = Storage.storage()
        let nomeImagem = self.nome + ".jpg"
        let storageRef = storage.reference().child("App/Eleitores").child(userID).child("ImagemPerfil").child(nomeImagem)
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpeg"

        if let uploadData = UIImageJPEGRepresentation(self.imagemPerfil.image!, 0.2){
            storageRef.putData(uploadData, metadata: metadata, completion: { (metadata, error) in
                if error == nil{
                    storageRef.downloadURL { url, error in
                        if error != nil {
                            // Handle any errors
                        } else {
                            self.mEleitorModel.urlFotoPerfil = url?.absoluteString
                            self.gravaUsuario()
                        }
                    }
                }
            })
        }
    }

    func criaUsuario() -> Void {
        Auth.auth().createUser(withEmail: email, password: senha) { (user, error) in
            if error == nil {

                self.userID = Auth.auth().currentUser!.uid
                let date = Date()
                let formatter = DateFormatter()
                formatter.dateFormat = "dd/MM/yyyy"
                let dataAtual = formatter.string(from: date)

                self.mEleitorModel.id = self.userID
                self.mEleitorModel.nome = self.nome + " " + self.sobrenome
                self.mEleitorModel.email = self.email
                self.mEleitorModel.dataCadastro = dataAtual

                self.uploadImage()
            }
            else{
                if error.debugDescription.contains("The email address is already in use by another account."){
                    let alert = UIAlertController(title: "Atenção", message: "Este email já consta em nosso cadastro, efetue o login ou relembre sua senha.", preferredStyle: UIAlertControllerStyle.alert)
                    alert.addAction(UIAlertAction(title: "Relembrar Senha", style: UIAlertActionStyle.default, handler: { (action) in
                        self.telaAlterarSenha()
                    }))
                    alert.addAction(UIAlertAction(title: "Login", style: UIAlertActionStyle.default, handler: { (action) in
                        self.telaLogin()
                    }))
                    self.present(alert, animated: true, completion: nil)

                }
                FunctionDefault.dismissProgrees()
                FunctionDefault.AlertMessage(title: "Erro", message: "Ocorreu uma falha ao processar seu pedido, revise seus dados e tente novamente!", targetVC: self)
            }
        }
    }

    func gravaUsuario() -> Void {

        let encodedObject = try? JSONEncoder().encode(self.mEleitorModel)
        let jsonObject = String(data: encodedObject!, encoding: .utf8)
        let dict = FunctionDefault.convertToDictionary(text: jsonObject!)

        self.ref.child("eleitores").child(userID).setValue(dict)
        FunctionDefault.dismissProgrees()
        //TODO: tratar proxima tela
    }

    func capturaFoto() -> Void {
        let controller = UIImagePickerController()
        controller.delegate = self
        controller.sourceType = .photoLibrary
        present(controller, animated: true, completion: nil)
    }

    func telaLogin() -> Void {
        let storyboard = UIStoryboard(name: "Usuario", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "LoginViewController") as UIViewController
        present(vc, animated: true, completion: nil)
    }

    func telaAlterarSenha() -> Void {
        let storyboard = UIStoryboard(name: "Usuario", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "AlterarSenhaViewController") as UIViewController
        present(vc, animated: true, completion: nil)
    }
}

Answered by Leonardo Figueiredo on February 11, 2021

Você pode fazer um código gigante na mão ou usar um pod, que é o que eu recomendo. Já usei o pod ALCameraViewController, que possibilita tanto tirar fotos quanto escolher da galeria. Você pode encontrar o github dele aqui:

https://github.com/AlexLittlejohn/ALCameraViewController

Passos para utilização:

1) Adicione no seu podfile:

pod 'ALCameraViewController'

2) Importe no seu arquivo que vai chamar a view controller da camerâ o pod, com a seguinte linha:

import ALCameraViewController

3) Na hora de chamar a view controller da câmera use o seguinte código:

let cameraViewController = CameraViewController { [weak self] image, asset in
    // A variável image que você recebe aqui vai ter a imagem que o usuário escolheu. Fique atento para o caso que ele cancela a escolha da imagem.
    self?.dismiss(animated: true, completion: nil)
}

present(cameraViewController, animated: true, completion: nil)

Para mais dicas de swif, desenvolvimento iOS e empreendedorismo se inscreva no meu canal do youtube: https://www.youtube.com/channel/UCNghEgS-PkKMDbZfiwhvYpA

Answered by Rodrigo Guimarães on February 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP