0

私は現在、自転車で使用するために、速度の進行方向の位置と他のいくつかのセンサーの読み取り値を表示するiPhoneアプリを作成しています。アクセルから傾斜の読み取り値を取得することができました。私がやろうとしているのは、傾きの読み取り値に応じて画像を左または右に移動することです。

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

=記号が私の画像であるとしましょう。傾斜角度に応じて、左端または右端に向かって移動させようとしています。

何か案は?なんとかアニメーションで動かすことができましたが、長時間傾いていると動き続けたくありません。

4

2 に答える 2

2

まず、以下を使用してアクセラレータデータを追加しました。

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

タイミングが0.1秒であることに注意してください。そのタイミングを以下のアニメーションに一致させる必要があります。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);
    }] ;
}

次の更新が完了する前にアニメーションを完了するようにupdateInterval、アニメーションの長さをのと一致させることが重要です。UIAccelerometer

ここで重要なのは、おそらくnewX位置を決定するための数学です。基本的に画像の幅の半分を取りました。これが左端の絶対位置だからです。そこから、320-imageView.frame.size.width追加できる余裕があることがわかりました。全体を足すと、320-imageView.frame.size.width一番320-imageView.frame.size.width/2右の位置になります。そこから、320-imageView.frame.size.width加速した量に応じてチャンクを分割する必要がありました。データは-1から1のaccelerator.x範囲にあるので、私の範囲全体は2です。そこで、に1を追加して、0から2accelerator.xに正規化しました。次に、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位置を取得します。

それがあなたが探しているものであることを願っています!私はそれをデバイスでテストしました、そしてあなたがあなたの期間を一致させる限りそれはかなりスムーズです。

于 2012-07-18T13:32:54.633 に答える
0

アニメーションについて質問している場合。これは、UIViewをアニメーション化するためのコードアップルの推奨事項です。また、x座標とy座標の値を変更できます。

    imageFrame.origin.y = 200;

[UIView animateWithDuration:0.5
                      delay:0.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     datePickerView.frame = imageFrame;
                 } 
                 completion:^(BOOL finished){
                     self.datePickerViewFlag = YES;
                 }];
于 2012-07-17T19:01:03.240 に答える