iOSプログラミング with Swift 2


2016.05.27: created by

Swiftでモーションセンサを使う

  1. Xcode を起動して "Create a new Xcode project" で "iOS" -> "Application" -> "Single View Application" として新しいプロジェクトを開きます。 ここではプロジェクト名を SwiftMotion としています。



  2. プロジェクトの最初に表示される画面は、ウィンドウの左側に表示されている "Show the project navigator" アイコンをクリックしても表示されます。 "General" -> "Linked Frameworks and Libraries" ->"+"ボタン を押して CoreMotion.framework を追加します。









  3. Main.storyboard上の ViewController に、右下の "Object library" から "Label" をドラッグして合計12個配置します。各ラベルはAttribute Inspectorで、 "alignment"を「左詰め」にしておきましょう。 左に4個離れて配置したラベルは、textをそれぞれ"加速度","ジャイロ","重力ベクトル", "姿勢" に変更しましょう。






  4. Main.storyboard上の ViewController に、右下の "Object library" から "Button" を2個ドラッグして配置します。 さらに、"Button"に表示されているテキストを "Start" と "Stop" にします。



  5. Main.storyboardが表示されている状態で、 ウィンドウの右上の "Show the Assistant Editor" ボタン をクリックして、右側のウィンドウに ViewController.swift が表示されている 状態にします。



  6. Main.storyboard上の右側の(textを"Label"から変更していない) 12個のLabel について、 まず1回クリックして選択してから、 右マウスボタン(またはControllキー+左マウスボタン)でドラッグして、 右側の画面のViewController.swift の
    class ViewController: UIViewController {
    
    の下の行まで持っていきます。



  7. ConnectionはOutletで、 Name をそれぞれ次のように設定して Connect をクリックしましょう。

    xAccelLabel,
    yAccelLabel,
    zAccelLabel,
    xGyroLabel,
    yGyroLabel,
    zGyroLabel,
    xGravityLabel,
    yGravityLabel,
    zGravityLabel,
    pitchLabel,
    rollLabel,
    yawLabel
    
  8. ViewControllerクラスの中に、 Main.storyboard上の各Labelと結び付いた(= @IBOutlet のついた)変数定義ができます。



  9. Main.storyboard上の2個の Button について、 1回クリックして選択してから、 右マウスボタン(またはControllキー+左マウスボタン)でドラッグして、 右側の画面のViewController.swift の
    override func viewDidLoad() {
    
    の上の行まで持っていきます。 ConnectionはAction, Name はそれぞれ "tapStart", "tapStop" としてConnect をクリックしましょう。



  10. ViewController.swift に
    @IBAction func tapStart(sender: AnyObject) {
    }
    @IBAction func tapStop(sender: AnyObject) {
    }
    
    という2行が追加されます。



  11. ViewController.swift を変更します。
  12. ViewController.swiftに追加するコード(赤字部分)
    import UIKit
    import CoreMotion
    
    class ViewController: UIViewController {
        @IBOutlet weak var xAccelLabel: UILabel!
        @IBOutlet weak var yAccelLabel: UILabel!
        @IBOutlet weak var zAccelLabel: UILabel!
        @IBOutlet weak var xGyroLabel: UILabel!
        @IBOutlet weak var yGyroLabel: UILabel!
        @IBOutlet weak var zGyroLabel: UILabel!
        @IBOutlet weak var xGravityLabel: UILabel!
        @IBOutlet weak var yGravityLabel: UILabel!
        @IBOutlet weak var zGravityLabel: UILabel!
        @IBOutlet weak var pitchLabel: UILabel!
        @IBOutlet weak var rollLabel: UILabel!
        @IBOutlet weak var yawLabel: UILabel!
    
        let cmManager = CMMotionManager()
    
        @IBAction func tapStart(sender: AnyObject) {
            cmManager.deviceMotionUpdateInterval = 0.1
            let handler:CMDeviceMotionHandler = {
                (motionData: CMDeviceMotion?, error: NSError?) -> Void in
                self.motionAnimation(motionData, error: error)
            }
            cmManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: handler)
        }
        
        @IBAction func tapStop(sender: AnyObject) {
            if (cmManager.deviceMotionActive) {
                cmManager.stopDeviceMotionUpdates()
            }
        }
        
        func motionAnimation(motionData: CMDeviceMotion?, error: NSError?) {
            if let motion = motionData {
                xGyroLabel.text = String(format:"%.2f", motion.rotationRate.x)
                yGyroLabel.text = String(format:"%.2f", motion.rotationRate.y)
                zGyroLabel.text = String(format:"%.2f", motion.rotationRate.z)
                
                xAccelLabel.text = String(format:"%.2f", motion.userAcceleration.x)
                yAccelLabel.text = String(format:"%.2f", motion.userAcceleration.y)
                zAccelLabel.text = String(format:"%.2f", motion.userAcceleration.z)
                
                xGravityLabel.text = String(format:"%.2f", motion.gravity.x)
                yGravityLabel.text = String(format:"%.2f", motion.gravity.y)
                zGravityLabel.text = String(format:"%.2f", motion.gravity.z)
                
                pitchLabel.text = String(format:"%.2f", motion.attitude.pitch)
                rollLabel.text = String(format:"%.2f", motion.attitude.roll)
                yawLabel.text = String(format:"%.2f", motion.attitude.yaw)
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    }
    
    
  13. Xcodeを起動中にiOSデバイスを Mac に接続すると、 Xcode のstatusに "Processing symbol files"

    と表示されて、しばらく待つと 左上の実行デバイスに 接続したiOSデバイスの名前が表示される。 これを選択して実行する。



  14. アプリが起動した状態で画面上の "Go Button" を押すとカメラ撮影の画面に移動する。 撮影した画像を選択するとアプリの画面に戻るが ViewImage には撮影した写真が表示され、 さらにデバイス本体のアルバムにもその写真が保存されている。



  15. サンプルのプロジェクトはこちら。(Xcode 7.3.1版)


http://karel.tsuda.ac.jp