如何在animateWithDuration块期间利用UIView的变化值?

时间:2013-03-15 02:40:51

标签: ios objective-c uiview uislider

我正在使用animateWithDuration来更改UISlider的值:

[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);
}

但该代码仅在动画块的 end 处调用。以一种非常有意义的方式,因为我真的只调用了一次setValue。但我希望动画块会以某种方式在其内部机制中反复调用它,但似乎并非如此。

如果UIView animateWithDuration在这里是一个死胡同,我想知道是否有更好的方法来实现与其他东西相同的功能?也许SDK的另一个光滑的小块驱动部分我不知道哪个允许动画不仅仅是UIView参数?

3 个答案:

答案 0 :(得分:2)

我认为最好的方法是处理它是编写一个自定义Slide你可以创建它像进度条,github上有很多demo。

你也可以使用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];

}

<强>更新

如何添加块:

1st:你可以定义一个块处理程序:

typedef void (^CompleteHandler)();

第二步:创建你的块并将其添加到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];

第四:实现你的计时器方法:

- (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];

}

答案 1 :(得分:0)

我不知道是否有任何类型的通知你可以“点击”获取UIView动画“步骤”,但你可以使用NSTimer“手动”进行动画,这将允许你连续更新你的价值。

答案 2 :(得分: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];
}