2

UISliderの値を変更するためにanimateWithDurationを使用しています。

[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{ [myUISlider setValue:10]; }
                 completion:^(BOOL finished){ }];

問題は、UISliderが変更されている間、その現在の値を表示できる必要があるということです。これは、animateWithDurationを使用しても可能ですか?UISliderサブクラスを作成し、setValueをオーバーライドして、スライダーの値が変更されたときにアクセスできるようにしました。

-(void)setValue:(float)newValue
{
    [super setValue:newValue];

    NSLog(@"The new value is: %f",newValue);
}

ただし、そのコードはアニメーションブロックの最後でのみ呼び出されます。私は実際には一度だけsetValueを呼び出したので、完全に理にかなっている方法で。しかし、アニメーションブロックが内部メカニズム内で何度も何度もそれを呼び出すことを望んでいましたが、そうではないようです。

UIView animateWithDurationがここで行き止まりになっている場合、他の何かでこの同じ機能を実現するためのより良い方法があるのだろうか?おそらく、SDKのもう1つの洗練された小さなブロック駆動部分で、UIViewパラメーター以外のアニメーションを可能にするものについてはわかりません。

4

3 に答える 3

2

Slideそれを処理する最善の方法は、githubに多くのデモがあるプログレスバーのように作成できるカスタムをコーディングすることだと思います。

使用することもできますNSTimerが、あまり良い方法ではないと思います。

をタップすると、timer:を作成できます。

_timer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(setValueAnimation) userInfo:nil repeats:YES];

そしてivarを設定します:_value = oldValue;

メソッドでsetValueAnimation

- (void)setValueAnimation
{
    if (_value >= newValue) {
        [_timer invalidate];
        _value = newValue;
        [self setVale:_value];
        return;
    }

    _value += .05;

    [self setVale:_value];

}

アップデート

ブロックを追加する方法:

1番目:ブロックハンドラーを定義できます:

typedef void (^CompleteHandler)();

2番目:ブロックを作成してuserInfoに追加します:

CompleteHandler block = ^(){
    NSLog(@"Complete");
};

NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:block,@"block", nil];

3番目::を作成しNSTimerます

_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(setValueAnimation:) userInfo:userInfo repeats:YES];

4番目:タイマーメソッドを達成する:

- (void)setValueAnimation:(NSTimer *)timer
{
    if (_value >= newValue) {
        [_timer invalidate];
        _value = newValue;
        [self setVale:_value];

        // also can use [_delegate complete];

        CompleteHandler block = [timer.userInfo objectForKey:@"block"];
        if (block) {

              block();

        }
        return;
    }

    _value += .05;

    [self setVale:_value];

}
于 2013-03-15T03:01:57.623 に答える
0

UIViewアニメーションの「ステップ」を取得するために「タップ」できる通知があるかどうかはわかりませんが、NSTimerを使用して「手動で」アニメーションを実行できます。これにより、値を継続的に更新できます。 。

于 2013-03-15T02:54:45.540 に答える
0

UIViewを使用したすぐに使えるソリューションがある場合-私はすべての耳です。このアニメーションフレームワーク(2クラスのみ!)-PRTween https://github.com/chris838/PRTweenを使用すると、便利なタイミング関数と変更された値にアクセスできます。

これが私の更新されたプロジェクトですhttps://github.com/jdp-global/KACircleProgressView/

PRTweenPeriod *period = [PRTweenPeriod periodWithStartValue:0 endValue:10.0 duration:1.0];

PRTweenOperation *operation = [PRTweenOperation new];
operation.period = period;
operation.target = self;
operation.timingFunction = &PRTweenTimingFunctionLinear;
operation.updateSelector = @selector(update:)

[[PRTween sharedInstance] addTweenOperation:operation]

- (void)update:(PRTweenPeriod*)period {
  [myUISlider setValue:period.tweenedValue];
}
于 2013-12-03T06:48:13.897 に答える