แสดง Preview กล้องบน UIView ใช้ UIImagePickerController (ง่าย) หรือ AVFoundation (ยืดหยุ่น)
วิธีที่ 1: UIImagePickerController (ง่าย)
import UIKit
class CameraPreviewViewController: UIViewController,
UIImagePickerControllerDelegate, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
setupCameraPreview()
}
func setupCameraPreview() {
guard UIImagePickerController.isSourceTypeAvailable(.camera) else {
print("Camera not available")
return
}
let picker = UIImagePickerController()
picker.sourceType = .camera
picker.cameraDevice = .front // หรือ .rear
picker.showsCameraControls = false // ซ่อน UI ควบคุม
picker.delegate = self
// เพิ่มเป็น Child View Controller
addChild(picker)
view.addSubview(picker.view)
picker.view.frame = view.bounds
picker.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
picker.didMove(toParent: self)
}
}
วิธีที่ 2: AVFoundation (ยืดหยุ่นสูง)
import AVFoundation
class CameraPreviewViewController: UIViewController {
var captureSession = AVCaptureSession()
var previewLayer: AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
super.viewDidLoad()
setupCamera()
}
func setupCamera() {
captureSession.sessionPreset = .high
guard let frontCamera = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video,
position: .front),
let input = try? AVCaptureDeviceInput(device: frontCamera) else { return }
captureSession.addInput(input)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = .resizeAspectFill
previewLayer.frame = view.bounds
view.layer.addSublayer(previewLayer)
DispatchQueue.global(qos: .userInitiated).async {
self.captureSession.startRunning()
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
previewLayer?.frame = view.bounds
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
captureSession.stopRunning()
}
}
เปรียบเทียบ
| คุณสมบัติ | UIImagePickerController | AVFoundation |
|---|---|---|
| ความซับซ้อน | ต่ำ | สูง |
| Custom UI | จำกัด | เต็มรูปแบบ |
| Manual Focus/Exposure | ไม่ได้ | ได้ |
| Photo/Video Capture | Built-in | ต้องเขียนเอง |
| Performance | ดี | ดีกว่า (Low level) |
Info.plist
ต้องเพิ่ม NSCameraUsageDescription
หมายเหตุ
- ไม่ทำงานบน Simulator
- AVFoundation ให้ Control เต็มรูปแบบ แต่โค้ดเยอะกว่า
- UIImagePickerController เหมาะสำหรับ Capture Photo/Video ธรรมดา