Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธาเพิ่ม Live Camera Preview ลง UIView ใน Swift

แสดง 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()
    }
}

เปรียบเทียบ

คุณสมบัติUIImagePickerControllerAVFoundation
ความซับซ้อนต่ำสูง
Custom UIจำกัดเต็มรูปแบบ
Manual Focus/Exposureไม่ได้ได้
Photo/Video CaptureBuilt-inต้องเขียนเอง
Performanceดีดีกว่า (Low level)

Info.plist

ต้องเพิ่ม NSCameraUsageDescription

หมายเหตุ

  • ไม่ทำงานบน Simulator
  • AVFoundation ให้ Control เต็มรูปแบบ แต่โค้ดเยอะกว่า
  • UIImagePickerController เหมาะสำหรับ Capture Photo/Video ธรรมดา