ややめも

アプリ作りたい女子大学院生のめも💁‍♀️

技術メモ
日記
つくったもの
就活の話

[iOS]端末の向きに合わせて写真を保存する

カメラを用いたiosアプリを開発しました。
blog.yayawatanabe.net

写真メモ帳 フォトメモ

写真メモ帳 フォトメモ

  • Satoshi Kobayashi
  • 仕事効率化
  • 無料


このアプリを作った際に、端末の向きよって写真の保存する向きを変えたかったので、
加速度センサーのライブラリを用いて実装したコードを備忘録としてメモしておきます。


同じようなことをしている記事を見つけたのですが、
5年前の記事のため情報が古くなっていたのと、正しい向きで保存されていなかったため、実装し直しました。
[iPhone] CMAccelerometerData 加速度センサー
加速度センサーについてはこちらの記事を参考にしています。

// クラス変数
    // カメラの投影用のImageView
    @IBOutlet private weak var imageView: UIImageView!
    let motionManager = CMMotionManager()
    var photoOrientation: UIImage.Orientation = UIImage.Orientation.up

    override func viewDidLoad() {
        super.viewDidLoad()
        if motionManager.isAccelerometerAvailable {
            // intervalの設定 [sec]
            motionManager.accelerometerUpdateInterval = 0.2
            
            // センサー値の取得開始
            motionManager.startAccelerometerUpdates(
                to: OperationQueue.current!,
                withHandler: { (accelData: CMAccelerometerData?, _: Error?) in
                    self.photoOrientation = self.getOrientation(x: accelData!.acceleration.x, y: accelData!.acceleration.y)
                }
            )
        }


    private func getOrientation(x: Double, y: Double) -> UIImage.Orientation {
        var orientation: UIImage.Orientation!
        if fabs(x) < 0.5 {
            if y < 0 {
                orientation = UIImage.Orientation.up
            } else {
                orientation = UIImage.Orientation.down
            }
        } else {
            if x < 0 {
                orientation = UIImage.Orientation.left
            } else {
                orientation = UIImage.Orientation.right
            }
        }
        return orientation
    }
    
    // センサー取得を止める場合
    func stopAccelerometer() {
        if motionManager.isAccelerometerActive {
            motionManager.stopAccelerometerUpdates()
        }
    }


// 撮影処理
    private func takePhoto() {
            // 省略  

            // imageを取り出して画像の回転を設定
            image = UIImage(cgImage: imageView.image!.cgImage!, scale: 1.0, orientation: photoOrientation)
            // 保存処理
     }


端末を回すとそれにあわせて保存したときの写真の向きもいい感じになりました!