我正在使用 animateWithDuration 来更改 UISlider 的值:
[UIView animateWithDuration:1.0f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{ [myUISlider setValue:10]; }
completion:^(BOOL finished){ }];
问题是,我需要能够在 UISlider 发生变化时显示它的当前值。使用 animateWithDuration 是否可以实现这一点?我尝试创建一个 UISlider 子类并覆盖 setValue,希望能够在更改 slider 的值时访问它:
-(void)setValue:(float)newValue
{
[super setValue:newValue];
NSLog(@"The new value is: %f",newValue);
}
但是该代码仅在动画 block 的最末尾被调用。从某种意义上说,这是完全有道理的,因为我实际上只调用了一次 setValue 。但我希望动画 block 能以某种方式在其内部机制中一遍又一遍地调用它,但事实似乎并非如此。
如果 UIView animateWithDuration 在这里是一个死胡同,我想知道是否有更好的方法可以用其他东西来实现相同的功能?也许 SDK 的另一个光滑的小块驱动部分我不知道它允许动画不仅仅是 UIView 参数?
最佳答案
我认为最好的处理方法是编写一个自定义的幻灯片
,你可以像进度条一样创建它,github上有很多演示。
你也可以使用NSTimer
来做到这一点,但我不认为这是一个更好的方法。
当您点击 时,您可以创建一个计时器
:
_timer = [NSTimer ScheduledTimerWithTimeInterval:.1 target:self 选择器:@selector(setValueAnimation) userInfo:nil 重复:YES];
并设置一个ivar:_value = oldValue;
在setValueAnimation
方法中:
- (void)setValueAnimation
{
if (_value >= newValue) {
[_timer invalidate];
_value = newValue;
[self setVale:_value];
return;
}
_value += .05;
[self setVale:_value];
}
更新
如何添加 block :
第一:您可以定义一个 block 处理程序:
typedef void (^CompleteHandler)();
第二:创建您的 block 并将其添加到 userInfo 中:
CompleteHandler block = ^(){
NSLog(@"Complete");
};
NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:block,@"block", nil];
第三:制作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];
}
关于ios - 如何在 animateWithDuration block 期间利用 UIView 的变化值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15423797/