问题
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.
回答1:
#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;
}
}
}
}
回答2:
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
}
}
})
来源:https://stackoverflow.com/questions/37983869/detecting-shake-gesture-by-coremotion