我正在使用加速度計在UIScrollVIew中滾動多個子視圖。當用戶向右滑動iPhone時,我想讓視圖(縱向)滾動到右側,並在設備向左輕彈時滾動到左側。如何確定iPhone手搖的方向
我想我可以通過記錄正負x加速度值來做到這一點,但我看到這些值通常是正值和負值的混合。我已經設置了1.5g的地板來消除不晃動的運動,並且在0.5秒的時間內觀察x值。
我確定有一個三角函數方法來確定輕彈的整體方向,並且您必須在輕彈運動的持續時間內測量值。我也確定有人已經明白了這一點。
有什麼想法嗎?
謝謝
我正在使用加速度計在UIScrollVIew中滾動多個子視圖。當用戶向右滑動iPhone時,我想讓視圖(縱向)滾動到右側,並在設備向左輕彈時滾動到左側。如何確定iPhone手搖的方向
我想我可以通過記錄正負x加速度值來做到這一點,但我看到這些值通常是正值和負值的混合。我已經設置了1.5g的地板來消除不晃動的運動,並且在0.5秒的時間內觀察x值。
我確定有一個三角函數方法來確定輕彈的整體方向,並且您必須在輕彈運動的持續時間內測量值。我也確定有人已經明白了這一點。
有什麼想法嗎?
謝謝
好的,算出了一個解決方案。當我檢測到搖晃動作(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;
}
注:我不能讓<和>符號正確的代碼塊上面的格式,所以我取代isLessThan和isGreaterThan的符號。
我開發了一個解決方案,它給了我比建議的解決方案更好的反饋(僅適用於左右搖動)。 我沒有在這裏的方式是相當敏感(識別小震動),但靈敏度可以通過改變tresholdFirstMove和tresholdBackMove(增幅爲低靈敏度)
在斯威夫特進行調整: (在你的viewController並添加「導入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/")
}
}
}
}
有比滾動整個iphone更好的滾動手勢。 – Brian 2009-06-19 16:10:49
視圖已通過手指滑動和觸摸UIPageControl進行滾動。這更多的是練習使用加速度計獲得一些經驗。但它似乎是一個簡單的方法在這些子視圖之間滾動,這些子視圖是流程中編號的步驟。我已經有了滾動功能,但是直到我可以確定方向爲止,我只能向一個方向滾動。 – Alpinista 2009-06-19 16:15:54