Published on

PhotosPicker va kamera — rasm tanlash va olish

Authors

Rasm tanlash va kameradan rasm olish — profil rasm, xabar ilovalari, ijtimoiy tarmoq va hujjat skanerlash kabi ko'p ilovalar uchun kerak bo'lgan funksional. SwiftUI da ikkita asosiy usul bor:

PhotosPicker (iOS 16+) — Apple ning zamonaviy rasmlar kutubxonasidan tanlash komponenti. U PhotosUI framework iga tegishli va SwiftUI bilan to'liq integratsiyalashgan. Foydalanuvchiga rasm, video yoki screenshot tanlash imkonini beradi.

UIImagePickerController — UIKit dan kelgan eski, lekin hali ham kerak bo'lgan komponent. U kameradan rasm olish uchun ishlatiladi (SwiftUI da hali to'liq kamera API yo'q).

PhotosPicker — rasmlar kutubxonasidan tanlash

import PhotosUI
import SwiftUI

struct RasmTanlash: View {
    @State private var tanlanganElement: PhotosPickerItem?
    @State private var tanlanganRasm: Image?

    var body: some View {
        VStack(spacing: 20) {
            // Tanlangan rasmni ko'rsatish
            if let tanlanganRasm {
                tanlanganRasm
                    .resizable()
                    .scaledToFit()
                    .frame(height: 300)
                    .clipShape(RoundedRectangle(cornerRadius: 16))
            } else {
                ContentUnavailableView(
                    "Rasm tanlanmagan",
                    systemImage: "photo",
                    description: Text("Pastdagi tugmani bosing")
                )
            }

            // PhotosPicker tugmasi
            PhotosPicker(
                selection: $tanlanganElement,
                matching: .images  // Faqat rasmlar
            ) {
                Label("Rasm tanlash", systemImage: "photo.on.rectangle")
                    .padding()
                    .background(.blue)
                    .foregroundStyle(.white)
                    .clipShape(Capsule())
            }
        }
        .padding()
        // Tanlangan element o'zgarganda rasmni yuklash
        .onChange(of: tanlanganElement) { _, yangi in
            Task {
                if let data = try? await yangi?.loadTransferable(type: Data.self),
                   let uiImage = UIImage(data: data) {
                    tanlanganRasm = Image(uiImage: uiImage)
                }
            }
        }
    }
}

Ko'p rasm tanlash

struct KopRasmTanlash: View {
    @State private var tanlanganlar: [PhotosPickerItem] = []
    @State private var rasmlar: [Image] = []

    var body: some View {
        VStack {
            ScrollView(.horizontal) {
                HStack {
                    ForEach(rasmlar.indices, id: \.self) { index in
                        rasmlar[index]
                            .resizable()
                            .scaledToFill()
                            .frame(width: 100, height: 100)
                            .clipShape(RoundedRectangle(cornerRadius: 10))
                    }
                }
            }

            // Ko'p tanlash — maxSelectionCount
            PhotosPicker(
                selection: $tanlanganlar,
                maxSelectionCount: 5,
                matching: .images,
                photoLibrary: .shared()
            ) {
                Label("Rasmlar tanlash (max 5)", systemImage: "photo.stack")
            }
        }
        .onChange(of: tanlanganlar) { _, yangilar in
            Task {
                rasmlar = []
                for element in yangilar {
                    if let data = try? await element.loadTransferable(type: Data.self),
                       let uiImage = UIImage(data: data) {
                        rasmlar.append(Image(uiImage: uiImage))
                    }
                }
            }
        }
    }
}

Kamera bilan rasm olish

import UIKit

// ═══════════════════════════════════════
//  KAMERA — UIViewControllerRepresentable
// ═══════════════════════════════════════
struct KameraKorinishi: UIViewControllerRepresentable {
    @Binding var rasm: UIImage?
    @Environment(\.dismiss) var yopish

    func makeUIViewController(context: Context) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController,
                                 context: Context) {}

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UIImagePickerControllerDelegate,
                       UINavigationControllerDelegate {
        let parent: KameraKorinishi

        init(_ parent: KameraKorinishi) { self.parent = parent }

        func imagePickerController(_ picker: UIImagePickerController,
            didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
            parent.rasm = info[.originalImage] as? UIImage
            parent.yopish()
        }

        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            parent.yopish()
        }
    }
}

// Ishlatish
struct ProfilRasmView: View {
    @State private var rasm: UIImage?
    @State private var kameraOchiq = false

    var body: some View {
        VStack {
            if let rasm {
                Image(uiImage: rasm)
                    .resizable()
                    .scaledToFit()
                    .frame(height: 200)
            }

            Button("Kameradan rasm olish") {
                kameraOchiq = true
            }
        }
        .fullScreenCover(isPresented: $kameraOchiq) {
            KameraKorinishi(rasm: $rasm)
                .ignoresSafeArea()
        }
    }
}

🎯 Topshiriq

Profil rasmini tanlash/olish ilovasi yarating: PhotosPicker bilan galereya va KameraKorinishi bilan kamera. Tanlangan rasm doira shaklida ko'rinsin. ActionSheet bilan "Galereya" yoki "Kamera" ni tanlash imkoni.

Buy mea coffee