私はiPad用のメトロノームを開発中です。metronomeArm アニメーションにはCGAffineTransformRotateを使用し、サウンドには NSTimer (精度にはあまり興味がありません)、metronomeArm で metronomeWeight をドラッグするためにUIPanGestureRecognizerを使用しています。
私の問題は、パンを使用してウェイトをドラッグして bpm を更新する方法がわからないことです。今のところ私はこれを持っています:metronomeWeight.center.y
240で、この位置のデフォルトの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;
}