ios - 如何在 animateWithDuration block 期间利用 UIView 的变化值?

标签 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,希望能够在更改 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/

相关文章:

objective-c - 当设备没有互联网(数据)访问权限时控制台出错

ios - SpriteKit : Why does playing sound return error?

ios - 检查给定的日期时间是否在 Objective C 中的其他两个日期时间之间

iphone - 识别子类 UITableViewCell 的 indexPath,这样我就可以指定我的 UILabel 的对齐方式

iphone - 从地址簿添加联系人时 EXC_BAD_ACCESS?

ios - 自动关闭弹出窗口,如 Tweetbot iOS 应用程序

ios - 将 Unity3d 集成到 iOS UITabbarController/UINavigationController

ios - 从ios中的UITabBarController中删除标签栏的安全方法

iOS 动画图像 : I like to move it while it plays

iphone - 为 UIView 自定义 initWithFrame