SwiftUI Camera & Gallery

Merhaba arkadaşlar, bu yazıda SwiftUI ile nasıl fotoğraf çekilir ve galeriden fotoğraf seçilir gibi konulara bakacağız. Hemen hemen bir çok projede kullandığımız bu işlemler için şu anda SwiftUI tarafında bir kontrol bulunmuyor. Bu yüzden UIKit ile bu işlemi gerçekleştirmemiz gerekiyor. UIKit’ten bir elemen kullanmak istediğimizde ise UIViewControllerRepresentable protokolünü kullanmamız gerekiyor.

İlk önce basit bir ekran tasarımı yapalım. Yukarıda 2 adet buton olan bir tasarım olacak. Bunlardan birisi kameradan fotoğraf çekmek için diğeri ise galeriden fotoğraf seçmek için. Bu butonların altında ise kameradan veya galeriden gelen fotoğraf yer alacak.

Bu ekranda 3 farklı State tanımlıyoruz. Bu statelerden birisi fotoğraf çekmek ve galeriden fotoğraf seçmek için açılan sayfanın açılıp açılmadığı. Bunun isImagePickerPresenting State’i ile tutuyoruz. Diğeri seçilen veya çekilen fotoğrafı tutmak için en son ise kameradan fotoğraf çekme mi yoksa galeriden fotoğraf seçme seçeneği olacak. Sonrasında ise basit bir tasarım ekledik.

 

UIViewControllerRepresentable

Asıl önemli işlem ise UIKit tarafından bir kontrol oluşturup buna SwiftUI ile haberleştirmek. Bunun için bir ImagePicker kontrolü oluşturuyorum. Bu yapı 2 adet değişken alacak. Bunlardan birisi fotoğraf mı yoksa galerinin mi açılacağı. Diğeri ise alınan veya çekilen fotoğrafı SwiftUI’a transferi için oluşturulan değişkeni. UIViewControllerRepresentable protokolü 2 adet fonksiyon istiyor. Bunlardan makeUIViewController fonksiyonu, UIKit’den kontrol oluşturmak için. Diğeri ise o kontrolü update etmek için. Benim için burada sadece kontrolü oluşturmak yeterli. Sonrasında bunun delegate’ini bağlamak için bir coordinator oluşturuyorum. Bu coordinator ile fotoğraf çekme veya seçme işlemi bittikten sonra selectedPhoto değişkenine atıyorum.

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

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.