ใช้ UIImagePickerController (ง่าย) แทน AVFoundation (ซับซ้อน) สำหรับถ่ายภาพและแสดงผล
ขั้นตอนการทำ
- เพิ่ม
UIImageViewใน Storyboard → เชื่อม IBOutlet - Conform Protocol:
UIImagePickerControllerDelegate, UINavigationControllerDelegate - เพิ่ม Tap Gesture หรือ Button เรียกกล้อง
- Implement Delegate Method
โค้ดเต็ม
import UIKit
class ViewController: UIViewController,
UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Tap to open camera
let tap = UITapGestureRecognizer(target: self, action: #selector(openCamera))
view.addGestureRecognizer(tap)
view.isUserInteractionEnabled = true
}
@objc func openCamera() {
guard UIImagePickerController.isSourceTypeAvailable(.camera) else {
print("Camera not available")
return
}
let picker = UIImagePickerController()
picker.sourceType = .camera
picker.cameraDevice = .rear // .front สำหรับกล้องหน้า
picker.allowsEditing = true // อนุญาต Edit/Crop
picker.delegate = self
present(picker, animated: true)
}
// Delegate: User ถ่ายรูปเสร็จ
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
// ใช้ editedImage ถ้า allowsEditing = true
let image = (info[.editedImage] ?? info[.originalImage]) as? UIImage
imageView.image = image
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
picker.dismiss(animated: true)
}
// Delegate: User ยกเลิก
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}
}
Info.plist (จำเป็น)
<key>NSCameraUsageDescription</key>
<string>แอปต้องการเข้าถึงกล้องเพื่อถ่ายภาพ</string>
UIImagePickerController vs AVFoundation
| คุณสมบัติ | UIImagePickerController | AVFoundation |
|---|---|---|
| ความซับซ้อน | ต่ำ | สูง |
| UI Built-in | มี (Controls, Preview, Edit) | ต้องสร้างเอง |
| Customization | จำกัด | เต็มรูปแบบ |
| Performance | ดี | ดีกว่า (Low latency) |
| เหมาะสำหรับ | ถ่ายภาพ/วิดีโอ ธรรมดา | AR, Custom Camera, Real-time Filter |
หมายเหตุ
- ไม่ทำงานบน Simulator ต้องทดสอบบน Device จริง
- allowsEditing = true ให้ User Crop/Rotate ได้
- ภาพที่ได้เป็น UIImage สามารถ Save, Upload, Process ต่อได้