停止在不同线程上执行的所有动画

时间:2011-11-06 13:53:21

标签: ios nsthread uiviewanimation

我有一个菜单,其中的项目会以3秒的间隔相互弹出,我这样做:

for(UIButton *menuItem in menuItems){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (0.3 * i) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        [menuItem setAlpha:1.0];
    }                             
}

是否可以在中间停止动画(例如,触摸按钮时)? 我尝试将所有内容设置为alpha 1.0,但正如预期的那样,线程继续运行并再次显示项目。

会欣赏任何想法:)
晒。

3 个答案:

答案 0 :(得分:3)

您可以使用基于块的动画制作动画,并设置delay:。没有线程担心。

这些动画可以通过启动另一个基于块的动画来中断,并设置选项UIViewAnimationOptionBeginFromCurrentState

对于alpha过渡,这很好,因为动画的当前位置无关紧要。如果要移动对象,可以通过查询保存对象当前状态的view.layer.presentationLayer来获取当前位置。您需要导入QuartzCore框架才能执行此操作。这也为您提供了一种方法removeAllAnimations,该方法几乎可以完成它的声音,并且可以将任何视图直接接收到它已挂起或处于活动状态的任何动画。

答案 1 :(得分:1)

我认为你不能停止已安排的动画。但是你可以设置一个带有BOOL标志的实例变量,指示按钮是否已被按下。

例如,假设按钮的目标是方法buttonTapped

将您的标记初始化为NO

- (id)init {
    if (self = [super init]) {
        buttonAlreadyTapped = NO;
    }

    return self;
}

在按钮的目标中,将标记设置为YES

- (void)buttonTapped {
    self.buttonAlreadyTapped = YES;
}

如果标记为alpha,则仅修改NO

for (NSInteger i = 1; i <= [menuItems count]; i++) {        
    UIButton *menuItem = [menuItems objectAtIndex:i-1];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (3 * i) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        if (!self.buttonAlreadyTapped) {
            menuItem.alpha = 1.0f;
        }
    });
}

请务必向UIKit发送消息,始终应在主线程上完成。

for (NSInteger i = 1; i <= [menuItems count]; i++) {        
    UIButton *menuItem = [menuItems objectAtIndex:i-1];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (3 * i) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        if (!self.buttonAlreadyTapped) {
            dispatch_async(dispatch_get_main_queue(), ^{
                menuItem.alpha = 1.0f;
            });
        }
    });
}

答案 2 :(得分:0)

也许你会在this回复中找到答案,也许你会以其他方式做你的事情。