我正在使用加速计在UIScrollVIew中滚动多个子视图。我希望当用户向右轻拂iPhone时,视图(纵向)向右滚动,当向左轻拂设备时,我希望向左滚动。
我认为我只能通过记录正x或负x加速度值来做到这一点,但我发现这些值通常是正值和负值的混合。我将地板设置为1.5g以消除无抖动,并且在0.5秒的持续时间内查看x值。
我确信有一种用于确定轻弹整体方向的三角法,并且您必须在轻弹动作的持续时间内测量值。我也确定有人已经把这个想出来了。
有任何想法吗?
由于
答案 0 :(得分:7)
我开发了一个解决方案,它给出了比建议的解决方案更好的反馈(仅适用于左右摇动)。 我在这里做的方式是非常敏感的(识别一个小的震动),但可以通过改变tresholdFirstMove和tresholdBackMove(增加灵敏度较低)来调整灵敏度
在Swift中: (在你的viewController中。并添加“import CoreMotion”)
var startedLeftTilt = false
var startedRightTilt = false
var dateLastShake = NSDate(timeIntervalSinceNow: -2)
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2)
var motionManager = CMMotionManager()
let tresholdFirstMove = 3.0
let tresholdBackMove = 0.5
override func viewDidLoad() {
// your code
motionManager.gyroUpdateInterval = 0.01
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
motionManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: { (gyroData, error) -> Void in
self.handleGyroData(gyroData.rotationRate)
})
}
private func handleGyroData(rotation: CMRotationRate) {
if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3
{
if !startedRightTilt && !startedLeftTilt
{
dateStartedTilt = NSDate()
if (rotation.z > 0)
{
startedLeftTilt = true
startedRightTilt = false
}
else
{
startedRightTilt = true
startedLeftTilt = false
}
}
}
if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3
{
startedRightTilt = false
startedLeftTilt = false
}
else
{
if (fabs(rotation.z) > tresholdBackMove)
{
if startedLeftTilt && rotation.z < 0
{
dateLastShake = NSDate()
startedRightTilt = false
startedLeftTilt = false
println("\\\n Shaked left\n/")
}
else if startedRightTilt && rotation.z > 0
{
dateLastShake = NSDate()
startedRightTilt = false
startedLeftTilt = false
println("\\\n Shaked right\n/")
}
}
}
}
答案 1 :(得分:5)
好的,制定出一个解决方案。当我检测到抖动运动(x轴上的加速度大于1.5)时,我启动一个计时器并将BOOL设置为true。虽然BOOL是真的,但我添加了加速度值。当计时器到期时,我停止添加加速度值并通过总加速度的符号确定抖动的方向。
- (void)accelerometer:(UIAccelerometer *)acel didAccelerate:(UIAcceleration *)aceler {
if (fabsf(aceler.x) > 1.5)
{
shake = YES;
NSTimeInterval myInterval = .75;
[NSTimer scheduledTimerWithTimeInterval:myInterval target:self selector:@selector(endShake) userInfo:nil repeats:NO];
return;
}
if(shake)
{
totalG += aceler.x;
}
}
- (void) endShake {
shake = NO;
int direction;
if (totalG isLessThan 0) direction = 1;
if(totalG isGreaterThan 0) direction = -1;
[self changePageByShake:direction];
totalG = 0;
}
注意:我无法得到&lt;和&gt;要在上面的代码块中正确格式化的符号,所以我用符号替换isLessThan和isGreaterThan。