2

カスタム UISlider を使用しています。を使用してユーザーが入力した後、値を保存しますslider.value。しばらくして、 を使用してスライドの位置を保存した値に戻す必要があります[slider setValue:savedValue]

しかし、保存時の位置と復元後の位置の間にいくつかの不一致があることに気付きました。

しばらくすると、ユーザーが親指を非常に速く動かすと、実際の値よりも遠くに移動することがわかりました (ある種の運動量/慣性効果)。1 つの値が 1 つの親指の位置に対応していることを確認するにはどうすればよいですか?

4

2 に答える 2

2

UIControlEventTouchUpInside「終了」を口述するためにキャッチしていると仮定すると、UIControlEventEditingDidEnd代わりに使用します。

それができない場合は、キーと値を監視valueして、変更のたびに将来の保存をキャンセルし、trackingが false の場合は、今から 0.5 秒後に新しいものをスケジュールできます。例えば

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(storeValue) object:nil];

if(!slider.tracking)
{
    [self performSelector:@selector(storeValue) withObject:nil afterDelay:0.5];
}

(または、パフォーマンスの問題が見つかった場合は、保存がスケジュールされているかどうかを明示的に保存すると思いますが、必要がない限り、過度に複雑にしないでください)

于 2014-01-22T21:44:12.667 に答える
2

値を整数として扱っていますか?

それ(UISliderオブジェクト)はfloatを格納するため、整数として扱うとこの動作が発生する可能性があります..

おそらく、変更を処理するアクションで再設定してください。これは 1 回か 2 回前に必要であることがわかりました。

-(IBAction) sliderMoved:(id)sender{
    
    UISlider *sld = (UISlider *)sender;
    CGFloat val = sld.value;
    val += 0.49; /// rounder...
    
    int result = (int) val;
    
    [sld setValue:(CGFLoat)result animated:YES];
    
    ///// etc process entry...
}

この種の処理は、スライダーをマルチポジションの「スイッチ」に変え、整数値にスナップしますfabsf(...).float領域に留まりたい場合は、関数でそれを行うことができます...

于 2014-01-22T21:21:10.913 に答える