Sudha
Sudha

Reputation: 105

Detecting Shake Gesture by CoreMotion

I want to detect device shake using coreMotion framework for iOS 7. Can anyone help me out how to do this ?

I wrote code described below in my viewDidAppear

CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    motionManager.deviceMotionUpdateInterval = 1.0/60.0;

__block double myAcceleration;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                   withHandler:^(CMDeviceMotion *motion, NSError *error)
 {
     myAcceleration = motion.userAcceleration.y;
     CATransform3D transform;
     transform = CATransform3DMakeRotation(
                                           motion.attitude.pitch, 1, 0, 0);
     transform = CATransform3DRotate(transform,
                                     motion.attitude.roll, 0, 1, 0);
     transform = CATransform3DRotate(transform,
                                     motion.attitude.yaw, 0, 0, 1);
 }
 ]; 

but not detecting shake.

Upvotes: 1

Views: 2074

Answers (2)

Praveen Kondapalli
Praveen Kondapalli

Reputation: 307

I know its old but i am posting for others who might be interested.

This Shake detection code can be also be used without ViewController or when the app is in the background (just by using the coremotion)

import CoreMotion

private var centralManager : CBCentralManager!

@IBOutlet weak var shakeLabel: UILabel!
let manager = CMMotionManager()

override func viewDidLoad() {
    super.viewDidLoad()

    var xInPositiveDirection = 0.0
    var xInNegativeDirection = 0.0
    var shakeCount = 0

    var tempVariable = 0

    manager.deviceMotionUpdateInterval = 0.02

    manager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: {
        (data, error) in


        if data!.userAcceleration.x > 1.0 || data!.userAcceleration.x < -1.0 {



            if data!.userAcceleration.x > 1.0 {
                xInPositiveDirection = data!.userAcceleration.x
            }

            if data!.userAcceleration.x < -1.0 {
                xInNegativeDirection = data!.userAcceleration.x
            }

            if xInPositiveDirection != 0.0 && xInNegativeDirection != 0.0 {
                shakeCount = shakeCount + 1
                xInPositiveDirection = 0.0
                xInNegativeDirection = 0.0
            }

            if shakeCount > 5 {
                tempVariable = tempVariable + 1
                self.shakeLabel.text = "Shaken! \(tempVariable)"
                shakeCount = 0
            }

        }
    })

Upvotes: 0

Sudha
Sudha

Reputation: 105

  #define accelerationThreshold  0.30

- (void)motionMethod:(CMDeviceMotion *)deviceMotion

{ 

 CMMotionManager *motionManager = [[CMMotionManager alloc] init];

    CMAcceleration userAcceleration = deviceMotion.userAcceleration;
    if (fabs(userAcceleration.x) > accelerationThreshold || fabs(userAcceleration.y) > accelerationThreshold || fabs(userAcceleration.z) > accelerationThreshold)
    {
        float sensitivity = 1;
        float x1 = 0, x2 = 0, y1 = 0, y2 = 0, z1 = 0, z2 = 0;

        double totalAccelerationInXY = sqrt(userAcceleration.x * userAcceleration.x +
                                            userAcceleration.y * userAcceleration.y);

        if (0.85 < totalAccelerationInXY < 3.45) {
            x1 = userAcceleration.x;
            y1 = userAcceleration.y;
            z1 = userAcceleration.z;

            float change = fabs(x1-x2+y1-y2+z1-z2);
            if (sensitivity < change) {

              // print change in position in coordinates.
                NSLog (@"total=%f x=%f y=%f z=%f timeStamp:%f, UpTime:%f", totalAccelerationInXY, userAcceleration.x, userAcceleration.y, userAcceleration.z, deviceMotion.timestamp, [[NSProcessInfo processInfo] systemUptime]);

                x2 = x1;
                y2 = y1;
                z2 = z1;
            }
        }
    }
}

Upvotes: 4

Related Questions