2012-04-14 155 views
0

我有一個標籤出現在手勢後,我想淡出標籤。下面的代碼可以工作,但是如果我連續做幾個手勢,最後一個不會完成淡入淡出和顯示,但會突然停止。這裏是我的代碼: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"); 
        }]; 
} 

有關如何解決的任何建議?

回答

0

問題可能是您要求處理器連續執行太多動畫和/或動畫被事件循環中的其他進程中斷。我經常發現像這樣的時間問題可以通過插入延遲來解決。

嘗試[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];

更換[self fadeOutLabels];(我的意思不是暗示我瞭解所有的內部運作,只有這樣雜牌已經在爲我工作)

+0

我試過你的代碼,但它做的是同樣的事情。我想這可能與多次分配相同標籤有關。它始終與屏幕上的兩個標籤一起工作,但第三個標籤通常沒有正常褪色而結束。任何其他想法? – 2012-04-15 12:15:14

+0

在我發佈最後一條評論之後,我又一次查看了代碼。我刪除了[[myLabel removeFromSuperview];'並且所有標籤都淡入淡出。 – 2012-04-15 12:21:27

+0

首先,您很善良,但您應該取消選中此答案,因爲它不起作用。接下來,實際上,即使代碼現在正在工作,您確實有泄漏。將myLabel賦值更改爲myLabel = [[[[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x,gestureEndPoint.y,200,20)] autorelease];'會照顧 - 除了所有的標籤現在因爲你忽略了'removeFromSuperview',所以你要留意你的視圖的生命週期......我會把它放在另一個答案中。 – Wienke 2012-04-15 13:12:44

0

您通過在fadeOutLabels方法中忽略removeFromSuperview解決了您的主要問題,但現在這些標籤將累積,佔用內存。而且你有一個漏洞,首先通過做一個alloc而不提供它的發佈。

我覺得這兩個變化可能完善你已經來到了解決方案:「myLabel」

1)作出的UILabel屬性稱爲

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]; 
} 
+0

我試過這段代碼,它也沒有做到這一點。當在前一個動畫結束之前從另一個手勢調用'gestureLabelAppear'時,它將從視圖中刪除以前的標籤。另外,因爲我使用ARC,所以我得到了'autorelease'的編譯器錯誤,我不認爲我需要這樣做。我做了一些更多的研究,並找到了有關使用帶標籤的標籤的鏈接[http://stackoverflow.com/a/9691975/1203475]。我將在下面的答案中發佈代碼。 – 2012-04-17 01:27:59

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; 
       }]; 
} 
+0

我很高興你有這個工作,但我很困惑,因爲這看起來與你最初做的一樣 - 只要淡入淡出完成就移除新添加的標籤。用'viewWithTag'完成很好的工作。現在您正在使用標籤跟蹤它,似乎沒有必要爲標籤創建屬性。 – Wienke 2012-04-17 11:31:55

+0

我認爲與原始代碼的區別在於,最初,每次淡入淡出完成時,最近創建的標籤都被刪除(因爲它們都是'myLabel')。現在,隨着標籤的添加,標籤的單獨引用。結果是,淡入淡出序列的完成現在使用啓動淡入淡出序列的標記而不是最近創建的標記來刪除標記。 – 2012-04-17 16:36:50

+0

現在* *聽起來像是一種解決方案,總是刪除*倒數第二個*添加的標籤,而不是剛剛淡出的標籤。但是這不需要你調用'[self fadeOutLabels:counter-1]'(並且只在計數器大於等於0時纔去除,以適應第一次出現)?實際上,您正在爲每個遞增的計數器標記*和*淡入淡出。 – Wienke 2012-04-18 00:44:43