[swift] Core Motion을 활용한 사진 촬영 도우미 앱 개발

이번 글에서는 Swift 언어와 Core Motion 프레임워크를 사용하여 사진 촬영 도우미 앱을 개발하는 방법에 대해 알아보겠습니다.

1. Core Motion이란?

Core Motion은 iOS 기기의 이동, 회전 및 가속도 등과 같은 모션 및 환경 데이터에 액세스하는 데 사용되는 프레임워크입니다. 이 프레임워크를 사용하면 가속도계, 자이로스코프 등과 같은 기기 하드웨어를 통해 측정된 데이터를 사용하여 다양한 앱을 개발할 수 있습니다.

2. 사진 촬영 도우미 앱 개발

이번 예제에서는 Core Motion을 사용하여 iPhone의 가속도계를 이용하여 사진 촬영 도우미 앱을 만들어보겠습니다. 이 앱은 사용자가 iPhone의 각도를 조절하여 자동으로 사진을 촬영하는 기능을 제공합니다.

2.1. 새 프로젝트 생성

먼저 Xcode에서 새로운 프로젝트를 생성합니다. “Single View App” 템플릿을 선택하고 원하는 프로젝트명과 저장 위치를 설정합니다.

2.2. Core Motion 설정

Core Motion을 사용하기 위해 프로젝트에 해당 프레임워크를 추가해야 합니다. 이를 위해 다음 단계를 따릅니다.

  1. 프로젝트 네비게이터에서 프로젝트 파일을 선택합니다.
  2. “Build Phases” 탭을 열고 “Link Binary With Libraries” 섹션을 찾습니다.
  3. ”+” 버튼을 클릭한 후 “CoreMotion.framework”를 선택하여 추가합니다.

2.3. View Controller에 코드 추가

이제 ViewController.swift 파일을 연 후 다음의 코드를 추가합니다.

import UIKit
import CoreMotion

class ViewController: UIViewController {

    let motionManager = CMMotionManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        if motionManager.isAccelerometerAvailable {
            motionManager.accelerometerUpdateInterval = 0.1
            motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
                if let acceleration = data?.acceleration {
                    self.handleAccelerometerData(acceleration)
                }
            }
        }
    }

    func handleAccelerometerData(_ acceleration: CMAcceleration) {
        let angle = atan2(acceleration.x, acceleration.y)
        
        // Calculate the threshold angle to trigger the photo capture
        let thresholdAngle = Double.pi / 4
        
        if abs(angle) > thresholdAngle {
            // Photo capture logic here
            // ...
        }
    }

}

2.4. 사진 촬영 로직 추가

handleAccelerometerData(_:) 메서드 내에서는 가속도계 데이터를 기반으로 iPhone의 기울기 각도를 계산하고, 일정 각도 이상으로 기울어지면 사진 촬영 로직을 실행하는 부분을 추가해야 합니다. 이 로직은 사진 촬영에 사용할 UIImagePickerController를 생성하고, 촬영한 사진을 저장하는 부분으로 구성됩니다.

// Photo capture logic here
if UIImagePickerController.isSourceTypeAvailable(.camera) {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .camera
    imagePicker.delegate = self
    self.present(imagePicker, animated: true, completion: nil)
}

2.5. UIImagePickerControllerDelegate 구현

사진을 촬영한 후에는 UIImagePickerControllerDelegate를 구현하여 촬영한 사진을 저장할 수 있는 기능을 추가해야 합니다. 이를 위해 ViewController.swift 파일에 다음 코드를 추가합니다.

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            // Save the captured photo here
            // ...
        }
        
        picker.dismiss(animated: true, completion: nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

}

2.6. 실행 및 테스트

이제 앱을 실행하여 iPhone을 기울여보면 일정 각도 이상으로 기울어지는 순간에 자동으로 사진이 촬영되는지 확인할 수 있습니다.

결론

이번 글에서는 Core Motion을 사용하여 사진 촬영 도우미 앱을 개발하는 방법에 대해 알아보았습니다. Core Motion은 다양한 모션 및 환경 데이터에 액세스할 수 있도록 해주는 강력한 프레임워크입니다. 이를 유연하게 활용하여 다양한 모션 기반 앱을 개발해보시기 바랍니다.

참고 자료:

이 글은 Swift 5와 iOS 14를 기준으로 작성되었습니다.