Press ESC to close

Swift Camera & Gallery

Merhaba arkadaşlar bu yazımda Swift ile nasıl kameradan ya da galeriden fotoğraf ve video işlemleri yaparız bundan bahsedeceğiz. Hemen hemen her uygulamada kullanıcıdan media istiyoruz. Burada bu konu bu yüzden önemli.

Bu yapacağımız örnek de üstte bir resim olacak altında ise bir buton. Kullanıcı butona basınca kameradan ya da galeriden fotoğraf veya resim isteyeceğiz. Telefonun kamerasını ya da galerisine erişmemiz için kullanıcıdan izin istememiz gerekiyor. Bunun için info.plist dosyasından gerekli izinleri yazmalıyız. Ben burada örnek olarak girdim. Uygulamayı mağazalara atarken bunlara dikkat etmek gerekiyor. Tam olarak ne için kullanacağınızı açıklamanız lazım yoksa Apple reddedebiliyor.

Bu uygulama için örnek ekran tasarımı aşağıdaki gibidir.

Sonrasında ise kod yazmaya başlayabiliriz. İlk olarak bir UIImagePicker oluşturmamız gerekiyor. Bu resim seçici ile telefonun kamerasına ya da galerisine ulaşabileceğiz. Eğer ki sadece resim ile işiniz varsa UIImagePicker medya türlerinde resim “public.image” ekleyebilirsiniz ama kullanıcının video eklemesine de izin veriyorsanız “public.movie” de eklemeniz gerekiyor. Sonrasında ise butona tıkladığında bir Action Sheet karşısına çıkartıyoruz. Burada kullanıcının medyayı kameradan mı yoksa galeriden mi seçeceğini soruyoruz. Buna göre UIImagePicker’ın kaynak tipini değiştiriyoruz.

 

Kullanıcı kamera ya da galeriden birini seçtikten sonra UIImgaePicker‘ın didFinishPickingMediaWithInfo fonksiyonuna düşüyor. Buna düşmesi için ise kullandığımız ViewController’ın UIImagePickerControllerDelegate, UINavigationControllerDelegate arayüzlerinden kalıtım alması gerekiyor. Fonksiyona düştükten sonra burada medya tipine göre ayarlayabilirsiniz. Diğer bir işlem ise kullanıcının fotoğraf veya videoda düzenledikten sonraki hallerini de alabilirsiniz.

 

Eğer kullanıcı resim seçtiyse direkt olarak bir UIImageView ile gösterebiliyoruz ama video seçtiyse AVPlayer ya da bir pod ile gösterebilirsiniz. Sonraki yazılarda AVPlayer hakkında detaylı bir yazı bulabilirsiniz.

//
//  ViewController.swift
//  SwiftCameraGallery
//
//  Created by Omer Sezer on 28.02.2021.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var ivImage: UIImageView!
    @IBOutlet weak var btnMedia: UIButton!
    
    let imagePicker = UIImagePickerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary
        imagePicker.mediaTypes = ["public.image", "public.movie"]
        
        btnMedia.addTarget(self, action: #selector(onBtnMediaClicked(_:)), for: .touchUpInside)
    }
    
    @objc func onBtnMediaClicked(_ sender: UIButton) {
        let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
        
        let btnCamera = UIAlertAction(title: "Kamera", style: .default) { (action) in
            self.imagePicker.sourceType = .camera
            self.present(self.imagePicker, animated: true)
        }
        
        let btnGallery = UIAlertAction(title: "Galeri", style: .default) { (action) in
            self.imagePicker.sourceType = .photoLibrary
            self.present(self.imagePicker, animated: true)
        }
        
        let btnCancel = UIAlertAction(title: "Vazgeç", style: .destructive) { (action) in
            
        }
        optionMenu.addAction(btnCamera)
        optionMenu.addAction(btnGallery)
        optionMenu.addAction(btnCancel)
        self.present(optionMenu, animated: true)
    }

}

extension ViewController: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let mediaType = info[.mediaType] as? String
        switch mediaType {
        case "public.movie":
            if let videoUrl = info[.mediaURL] as? NSURL {
                // TODO : set video to avplayer
                print(videoUrl)
            }
        case "public.image":
            if let image = info[.originalImage] as? UIImage {
                ivImage.image = image
            }
        default:
            break
        }
        self.dismiss(animated: true)
    }
}

extension ViewController: UINavigationControllerDelegate {
    
}

Ekran çıktısı aşağıdaki gibidir.

Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz. İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir