Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 持有及;释放按钮代码保持运行第一个动画完成块_Ios_Objective C_Cocoa Touch_Uiview - Fatal编程技术网

Ios 持有及;释放按钮代码保持运行第一个动画完成块

Ios 持有及;释放按钮代码保持运行第一个动画完成块,ios,objective-c,cocoa-touch,uiview,Ios,Objective C,Cocoa Touch,Uiview,我想按住一个按钮1秒钟,看着它淡入一种新的颜色,直到我松开那个按钮,这时我希望动画取消并返回到原始颜色 我的问题是,如果第二个操作发生在第一个操作完成之前,我还想取消归因于第一个操作的完成块(用户在完全更改颜色之前释放按钮) 下面的代码是我如何尝试去做的,但是无论发生什么,动作1的完成块每次都会完成。我应该使用完全不同的路线来使用此功能吗 - (void)animate1On { [UIView animateWithDuration:1.0 animations:^{

我想按住一个按钮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");

    }];
}
下面是我用来创建按钮和分配触地(保持)和触地(释放)呼叫的单独代码


现在,当你按下按钮时,你只是从头到尾运行你的方法,当你释放触摸时,它不会被取消。最好的选择是创建自定义按钮并覆盖touchsbegind:withEvent、move和end方法

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

- (void)animate1On:(id)sender{...}
- (void)animate1Off:(id)sender{...}
当您按下并保持该按钮时,让动画发生,但当您松开触摸键时,请取消动画设置方法并取消发送者的所有动画:

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

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

现在,当你按下按钮时,你只是从头到尾运行你的方法,当你释放触摸时,它不会被取消。最好的选择是创建自定义按钮并覆盖touchsbegind:withEvent、move和end方法

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

- (void)animate1On:(id)sender{...}
- (void)animate1Off:(id)sender{...}
当您按下并保持该按钮时,让动画发生,但当您松开触摸键时,请取消动画设置方法并取消发送者的所有动画:

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

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

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

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

    NSLog(@"ANIMATE ON COMPLETE");
}

这将确保仅当动画完成时才会执行
NSLog
行。

完成块将在动画完成或移除时执行。
finish
布尔标志用于帮助您决定是否应在completion块中执行代码。因此,
animate1On
中的完成块应如下所示:

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

    NSLog(@"ANIMATE ON COMPLETE");
}

这将确保只有动画完成时才会执行
NSLog
行。

animate1Off
中,您是否尝试移动
[self.button1.layer removeAllAnimations]动画块外部?将其放置在动画块之前,使其成为第一个执行的对象。仅尝试,不会更改任何内容。removeAllAnimations似乎为当前正在运行的动画运行完成块—不用担心。请参阅我的答案以了解问题的解决方案。在
animate1Off
中,您是否尝试过移动
[self.button1.layer removeAllAnimations]动画块外部?将其放置在动画块之前,使其成为第一个执行的对象。仅尝试,不会更改任何内容。removeAllAnimations似乎为当前正在运行的动画运行完成块—不用担心。请参阅我的答案,了解您问题的解决方案。我相信我正在做的事情与我在所有动画工作中使用强属性访问self.button1.layer时做的事情相同。我相信我在所有动画工作中使用强属性访问self.button1.layer时做的事情相同