0

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

- (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");
                     }];
}

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

4

3 回答 3

0

您通过省略方法解决了主要问题removeFromSuperviewfadeOutLabels但现在这些标签会累积,占用内存。并且您一开始就进行了分配而不提供释放。

我认为这两个更改可能会完善您已经得出的解决方案:

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];
}
于 2012-04-15T13:21:09.657 回答
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];

(我并不是说我了解所有的内部工作原理,只是说这个组合过去曾为我工作过类似的问题。)

于 2012-04-14T18:05:08.763 回答
0

这是似乎有效的代码。我需要为标签添加标签,这样我就可以明确地引用我正在创建的各个标签。我通过将 alpha 值更改为 0.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;
                 }];
}
于 2012-04-17T01:39:41.857 回答