1

我已经设法解决了这个问题,但是代码看起来效率很低,实际上,如果用户导航到另一个屏幕,延迟的方法调用在它们继续触发时会有点麻烦。

基本上我想要一个思想泡泡从一个角色的头上出现,但是是动画的,所以会出现一个小泡泡,然后是一个更大的泡泡,一个更大的泡泡,最后是一个包含一点动画的主泡泡。我通过使用自己的方法显示每个气泡,然后延迟调用这些方法来解决这个问题:

- (void)showMood {
    animating = TRUE;
    [self showBubble1];
}

- (void)showBubble1 {
    bubble1.hidden = FALSE;
    [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showBubble2 {
    bubble2.hidden = FALSE;
    [self performSelector:@selector(showBubble3) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showBubble3 {
    bubble3.hidden = FALSE;
    [self performSelector:@selector(showThoughtBubble) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showThoughtBubble {
    thoughtBubble.hidden = FALSE;   
    [self startBubbleAnimations];
    [self performSelector:@selector(hideThoughtBubble) withObject:nil 

afterDelay:kAnimationDuration * kAnimationRepeatCount];
    }

- (void)hideThoughtBubble {
    bubble1.hidden = TRUE;
    bubble2.hidden = TRUE;
    bubble3.hidden = TRUE;
    thoughtBubble.hidden = TRUE;
    [bubbleAnimation stopAnimating];
    animating = FALSE;
}

我想我可以创建一个大型动画,其中气泡都是同一帧的一部分,并且每一帧都包含一个气泡,但是我有点希望能够在 Interface Builder 中移动气泡,而这种方法不会提供很大的灵活性。

任何想法将不胜感激。

谢谢,

迈克尔

4

1 回答 1

0

可能有更好的方法来执行此序列,但一个简单的改进是在进行更改之前检查视图是否可见。这样,如果视图已被另一个视图替换,这些将停止:

- (void)showBubble1 {
    if (bubble1.window) {   // check to see if view is visible
        bubble1.hidden = NO;
        [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay];
    }
}

另外,我不确定您从哪个线程开始,但请确保它在主线程上。UI 调用应该只在主线程上完成。您可以使用其中一种 performSelectorOnMainThread:方法在主线程上启动它。

于 2010-07-26T16:40:16.957 回答