2012-07-17 110 views
0

我目前正在創建一個iPhone應用程序,顯示我的速度標題位置和一些其他傳感器讀數以供我的自行車使用。我已經設法從加速器獲得傾斜讀數。我想要做的是根據傾斜度讀數是向左還是向右移動圖像。在邊界內傾斜移動圖像

_______________________________ 
    :   ===    : 
    :   = =    : 
    :   ===    : 
    ------------------------------- 

可以說=符號是我的圖像,我試圖讓它根據傾斜角度向左或右邊緣移動。

有什麼想法?我已經設法通過動畫來移動它,但如果我長時間傾斜,我不希望它繼續移動。

+0

所以你有加速器數據,只是想弄清楚如何獲得一個平滑的動畫的傾斜?還是你想弄清楚加速器數據呢? – 2012-07-17 19:07:26

+0

那是正確的,我知道如何動畫,我有傾斜角度。即時通訊嘗試讓UIImageView移動到左側或右側,取決於設備的傾斜度。 im gueing我必須將運動邊界劃分爲一個百分比,然後根據它的傾斜程度取決於運動的百分比。 – Spriggsy 2012-07-17 20:02:18

+0

這就是我會做的。每當傾斜度發生顯着變化時,只需使用動畫更新圖像中心。如果到那時你還沒有發現任何問題,我會在回家時寫一個答案。 – 2012-07-17 20:15:51

回答

2

首先,我使用添加的加速器數據。您需要將該時機與下面的動畫進行匹配。然後,我設置了動畫在accelerometer:didAccelerate:委託調用:

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 

{ 
    NSInteger newX = 0; 

    newX = imageView.frame.size.width/2 + ((320-imageView.frame.size.width) * (acceleration.x+1)/2.0); 

    [UIView animateWithDuration:0.1 animations:^{ 
     imageView.center = CGPointMake(newX, imageView.center.y); 
    }] ; 
} 

它以匹配UIAccelerometer這樣的updateInterval動畫持續時間是重要的,你要確保未來的更新來通過前完成動畫。

這裏的重要部分可能是確定newX位置的數學。我基本上佔了圖像寬度的一半,因爲那是最左邊的絕對位置。從那裏我知道我有一個320-imageView.frame.size.width我可以添加的房間數量。如果我添加了整個320-imageView.frame.size.width,那麼我將在320-imageView.frame.size.width/2這是最右邊的位置。從那裏我只需要根據我們加速多少來分解320-imageView.frame.size.width塊。 accelerator.x數據範圍是-1到1,所以我的整個範圍是2.所以我加了1到accelerator.x從0-2歸一化。然後我除以2.0,以便我有一個0-1的範圍。現在我有一個乘數,我可以乘以我的320-imageView.frame.size.width範圍。如果它是0,我會在最左邊的位置。如果是1,我會處於最右邊的位置,其間的任何內容都會線性分解。所以最後一項是:

imageView.frame.size.width/2 + ((320-imageView.frame.size.width) * (acceleration.x+1)/2.0); 

得到圖像的新x位置。

我希望這就是你要找的!我在設備上測試過它,只要您匹配您的持續時間,它就非常流暢。

+0

非常感謝,您的代碼工作完美。對此,我真的非常感激 – Spriggsy 2012-07-19 13:46:23

0

如果您問關於動畫的問題。這是代碼蘋果推薦動畫UIView。你可以改變x和y座標的值。

UIAccelerometer *theAccelerometer = [UIAccelerometer sharedAccelerometer]; 
theAccelerometer.updateInterval = 0.1; //in seconds 
theAccelerometer.delegate = self; 

通知的定時爲0.1秒時:

imageFrame.origin.y = 200; 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        datePickerView.frame = imageFrame; 
       } 
       completion:^(BOOL finished){ 
        self.datePickerViewFlag = YES; 
       }];