Hold&释放按钮代码保持运行第一个动画完成块

时间:2013-12-05 15:22:50

标签: ios objective-c cocoa-touch uiview

我想按住一个按钮1秒钟,看着它淡入新颜色,直到我释放该按钮,此时我想要动画取消并返回原始颜色

我的问题是我还想取消归因于第一个操作的完成块,如果第二个操作在第一个操作发生之前发生(用户在完全更改颜色之前释放按钮)

下面的代码是我试图这样做的方法,但是无论如何,每次操作1的完成块都会完成。我应该采用完全不同的路线吗?

- (void)animate1On {

    [UIView animateWithDuration:1.0 animations:^{

        self.button1.backgroundColor = [UIColor whiteColor];
        self.button1.alpha = 0.4;

    } completion:^(BOOL finished) {
        NSLog(@"ANIMATE ON COMPLETE");
    }];
}

- (void)animate1Off {

    [UIView animateWithDuration:0.4 animations:^{

        [self.button1.layer removeAllAnimations];

        self.button1.backgroundColor = [UIColor redColor];
        self.button1.alpha = 0.2;

    } completion:^(BOOL finished) {

        NSLog(@"ANIMATE OFF COMPLETE");

    }];
}

下面是我用来创建按钮并分配touchDown(hold)和touchupinside(release)调用的单独代码

    self.button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    self.button1.frame = button1rect;
    self.button1.tag = 100;
    [self.button1 setTitle:@"1" forState:UIControlStateNormal];
    self.button1.layer.masksToBounds = YES;
    self.button1.layer.borderWidth = 0;
    self.button1.backgroundColor = [UIColor redColor];
    self.button1.alpha = 0.2;
    [self.button1 addTarget:self action:@selector(animate1On) forControlEvents:UIControlEventTouchDown];
    [self.button1 addTarget:self action:@selector(animate2Off) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.button1];

2 个答案:

答案 0 :(得分:1)

完成块将在动画完成或删除后执行。 finish布尔标志可以帮助您决定是否应该在完成块中执行代码。因此,animate1On中的完成块应如下所示:

completion:^(BOOL finished) {
    if (!finished) {
        return;
    }

    NSLog(@"ANIMATE ON COMPLETE");
}

这将确保NSLog行仅在动画结束时执行。

答案 1 :(得分:0)

现在当您按下按钮时,您只需从开始到结束运行您的方法,当您松开触摸时它不会被取消。最好的选择是创建自定义按钮并覆盖touchesBegan:withEvent,move和end方法。

但我认为对于简单的解决方案,您还可以更改您的方法以接受发件人作为参数:

- (void)animate1On:(id)sender{...}
- (void)animate1Off:(id)sender{...}

当你按下按钮并保持它让动画发生但是当你释放触摸时调用你的动画关闭方法并取消发送者的所有动画:

UIButton *btn = (UIButton*)sender;
[btn.layer removeAllAnimations];
//.... all of your code here

我没有测试过但是你可以尝试,它应该可以工作。