- Published on
PhotosPicker va kamera — rasm tanlash va olish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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.