褪色动画突然停止

时间:2012-04-14 15:23:37

标签: iphone xcode animation fade

我有一个手势后出现的标签,我想淡出标签。以下代码可以正常工作,但是如果我连续做几个手势,最后一个不完成淡入淡出和显示,但然后突然停止。这是我的代码:

- (void) gestureLabelAppear:(NSString *)theLabelText
{
    myLabel = [[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)];
    myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
    myLabel.textAlignment = UITextAlignmentCenter;  
    myLabel.text =theLabelText;
    [self.view addSubview:myLabel];
    [self fadeOutLabels];

}

-(void)fadeOutLabels
{
    [UIView animateWithDuration:3.0 
                          delay:0.0 
                        options:UIViewAnimationCurveEaseInOut 
                     animations:^ {
                         myLabel.alpha = 0.0;
                     } 
                     completion:^(BOOL finished) {
                         [myLabel removeFromSuperview];
                         NSLog(@"removed label");
                     }];
}

有关如何修复的任何建议?

3 个答案:

答案 0 :(得分:0)

问题可能在于您要求处理器连续执行太多动画和/或动画被事件循环中的其他进程中断。我经常发现这样的计时问题可以通过插入延迟来解决。

尝试将[self fadeOutLabels];替换为[self performSelector:@selector(fadeOutLabels) withObject:nil afterDelay:(NSTimeInterval)0.1];

和/或用[self.view addSubview:myLabel];

替换[self.view performSelector:@selector(addSubview:) withObject:myLabel afterDelay:(NSTimeInterval)0.1];

(我并不是说我理解所有的内部运作,只是说这个kludge在过去对我有用同样的问题。)

答案 1 :(得分:0)

您通过省略removeFromSuperview方法中的fadeOutLabels解决了主要问题,但现在这些标签会累积,占用内存。而且你通过在没有提供释放的情况下进行分配来开始泄漏。

我认为这两项改变可能会完善您已经达成的解决方案:

1)为UILabel创建一个名为“myLabel。”的属性。

2)将gestureLabelAppearfadeOutLabels更改为:

- (void) gestureLabelAppear:(NSString *)theLabelText 
{
if (self.myLabel) {
    [self.myLabel removeFromSuperview];
    self.myLabel = nil;
}
self.myLabel = [[[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)] autorelease];
self.myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
self.myLabel.textAlignment = UITextAlignmentCenter;  
self.myLabel.text =theLabelText;
[self.view addSubview:self.myLabel];
[self fadeOutLabels];

}

-(void)fadeOutLabels 
{
[UIView animateWithDuration:3.0 
                      delay:0.0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^ {
                     myLabel.alpha = 0.0;
                 } 
                 completion:NULL];
}

答案 2 :(得分:0)

这是似乎有用的代码。我需要在标签上添加标签,以便明确引用我正在创建的各个标签。我通过将alpha值更改为.2并观察它们消失来验证标签消失。

- (void) gestureLabelAppear:(NSString *)theLabelText 
{
    counter=counter+1;
    self.myLabel = [[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)];
    self.myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
    self.myLabel.textAlignment = UITextAlignmentCenter;  
    self.myLabel.text =[NSString stringWithFormat:@"%@-%d",theLabelText,counter];
    self.myLabel.tag=counter;
    [self.view addSubview:self.myLabel];
    [self fadeOutLabels:counter];    

}

-(void)fadeOutLabels:(int)theTag 
{
    [UIView animateWithDuration:3.0 
                      delay:0.0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^ {
                     self.myLabel.alpha = 0.2;
                 } 
                 completion:^(BOOL finished) {
                    UILabel *label = (UILabel *)[self.view viewWithTag:theTag]; 
                    [[self.view viewWithTag:theTag] removeFromSuperview];
                    label=nil;
                 }];
}