我正在使用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参数?
答案 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];
}