3

私はiPad用のメトロノームを開発中です。metronomeArm アニメーションにはCGAffineTransformRotateを使用し、サウンドには NSTimer (精度にはあまり興味がありません)、metronomeArm で metronomeWeight をドラッグするためにUIPanGestureRecognizerを使用しています。ここに画像の説明を入力

私の問題は、パンを使用してウェイトをドラッグして bpm を更新する方法がわからないことです。今のところ私はこれを持っています:metronomeWeight.center.y240で、この位置のデフォルトのbpmは80です.体重はトップ140から最大450になります.私はこの方法を実装しましたが、正しくありません.

-(void)updateBPM
    {
        CGFloat weightYPosition = metronomeWeight.center.y;
        NSUInteger newBPM = (weightYPosition/3);
        self.bpm = newBPM;
    }

パンのセレクターは次のとおりです。

-(void)handlePan:(UIPanGestureRecognizer*)gesture
{

    CGPoint translation = [gesture translationInView:metronomeArm];
    CGPoint location = [gesture locationInView:metronomeArm];

    NSLog(@"miscarea pe oy are valoare de: %f", location.y);

    CGPoint newCenter = CGPointMake(metronomeArm.frame.size.width/2, gesture.view.center.y + translation.y );

    if (newCenter.y >= 140 && newCenter.y <= 450) 
{
        gesture.view.center = newCenter;
        [gesture setTranslation:CGPointZero inView:metronomeArm];
        [self updateBPMFromWeightLocation];
        tempoLabel.text = [NSString stringWithFormat:@"%d", self.bpm];
        NSLog(@"metronomeWeight position : %f ",metronomeWeight.center.y);
    }
}

サウンドとアニメーションは更新されますが、希望どおりにはなりません。つまり、下限 bpm は 225 で、上限 bpm は 1 である必要があります。私の場合、それらはそれぞれ 150 と 46 です。

私の計算は良くないので、この問題を解決するのを手伝ってくれれば素晴らしいことです... Appleのメトロノームプロジェクトを何日も見てきましたが、彼らがどのようにこれを行うのか理解できません...

ありがとう

@zimmryan の提案による新しい updateBPM メソッド

-(void)updateBPMFromWeightLocation
{
    CGFloat weightYPosition = metronomeWeight.center.y;
    float lengthInM = ((weightYPosition - 140) * 0.00041333);
    float time = 2 * M_PI * sqrt(lengthInM / 9.8);
    NSUInteger newBPM = floor(60.0 / time);
    self.bpm = newBPM;
}
4

1 に答える 1