2012-04-14 7 views
0

Ich habe ein Label, das nach einer Geste erscheint und ich möchte das Etikett ausblenden. Der folgende Code funktioniert, aber wenn ich mehrere Gesten hintereinander mache, beenden die letzten nicht die Überblendung und Anzeige, sondern hören abrupt auf. Hier ist mein Code:Fade Animation abrupt stoppt

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

Irgendwelche Vorschläge zur Behebung?

Antwort

0

Das Problem kann sein, dass Sie den Prozessor bitten, zu viele Animationen nacheinander auszuführen und/oder die Animationen von anderen Prozessen in der Ereignisschleife unterbrochen werden. Ich finde oft, dass Timing-Probleme wie diese durch Einfügen einer Verzögerung behoben werden.

Try [self fadeOutLabels]; mit [self performSelector:@selector(fadeOutLabels) withObject:nil afterDelay:(NSTimeInterval)0.1];

Ersatz und/oder ersetzen [self.view addSubview:myLabel]; mit [self.view performSelector:@selector(addSubview:) withObject:myLabel afterDelay:(NSTimeInterval)0.1];

(damit meine ich nicht sagen, dass ich alle inneren Abläufe zu verstehen, nur dass diese Flickschusterei in der für mich gearbeitet hat Vergangenheit mit ähnlichen Problemen.)

+0

Ich habe versucht Ihren Code, aber es macht das gleiche. Ich denke, es könnte damit zusammenhängen, dass das gleiche Label mehrmals vergeben wird. Es arbeitet konsistent mit 2 Etiketten auf dem Bildschirm, aber das dritte Etikett endet im Allgemeinen ohne richtiges Verblassen. Irgendwelche anderen Gedanken? –

+0

Gleich nachdem ich den letzten Kommentar gepostet hatte, schaute ich noch einmal auf den Code. Ich habe '[myLabel removeFromSuperview];' entfernt und alle Labels werden ordnungsgemäß ausgeblendet. –

+0

Zuerst waren Sie freundlich, aber Sie sollten diese Antwort als akzeptiert deaktivieren, da es nicht funktioniert hat. Als nächstes, sogar wenn der Code jetzt funktioniert, haben Sie ein Leck. Ändern der myLabel-Zuweisung zu 'myLabel = [[[[UILabel Alloc] initWithFrame: CGRectMake (GestenEndPoint.x, GestenEndPoint.y, 200, 20)] Autorelease]; würde dafür sorgen - außer dass alle Beschriftungen jetzt gehen für den Lebenszyklus deiner Sicht zu bleiben, da du "removeFromSuperview" weglässt ... Ich werde das in eine andere Antwort bringen. – Wienke

0

Sie lösten Ihr Hauptproblem, indem Sie removeFromSuperview in der Methode fadeOutLabels auslassen, aber jetzt werden diese Bezeichnungen akkumulieren, Speicher hogging. Und Sie hatten zunächst ein Leck, indem Sie ein Alloc durchführen, ohne dafür zu sorgen, dass es freigegeben wird.

denke ich, diese beiden Änderungen könnten die Lösung perfektionieren Sie bereits angekommen an: „myLabel“

1) Stellen Sie eine Eigenschaft für UILabel genannt

2) Veränderung gestureLabelAppear und fadeOutLabels dazu:

- (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

Ich habe diesen Code ausprobiert und es funktioniert auch nicht. Es entfernt das vorherige Label aus der Ansicht, wenn 'GestenLabelAppear' von einer anderen Geste aufgerufen wird, bevor die vorherige Animation endet. Außerdem habe ich einen Compilerfehler für 'Autorelease', da ich ARC benutze. Ich glaube nicht, dass ich das tun muss. Ich habe etwas mehr recherchiert und diesen Link über die Verwendung von Tags mit Labels gefunden [http://stackoverflow.com/a/9691975/1203475]. Ich werde Code in Antwort unten posten. –

0

Hier ist der Code, scheint zu funktionieren. Ich musste Tags zu den Labels hinzufügen, damit ich explizit auf die einzelnen Labels verweisen konnte, die ich erstellte. Ich habe überprüft, dass die Beschriftungen verschwinden, indem ich den Alpha-Wert auf 0,2 ändere und beobachte, wie sie verschwinden.

- (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

Ich bin froh, dass du es funktionierst, aber ich bin verwirrt, weil es genauso aussieht wie das, was du ursprünglich gemacht hast - das neu hinzugefügte Etikett entfernen, sobald das Fade-Anim fertig ist.Gute Arbeit mit 'viewWithTag'. Jetzt, wo Sie es mit einem Tag verfolgen, scheint es nicht notwendig zu sein, eine Eigenschaft für das Etikett zu erstellen. – Wienke

+0

Ich denke, der Unterschied zum ursprünglichen Code ist, dass ursprünglich jedes Mal, wenn die Fade abgeschlossen wurde, das zuletzt erstellte Label entfernt wurde (da sie alle "myLabel" waren). Jetzt, mit dem Hinzufügen der Tags, werden die Labels einzeln referenziert. Das Ergebnis ist, dass die Vervollständigung der Fade-Sequenz jetzt das Label mit dem Tag entfernt, das die Fade-Sequenz anstelle des zuletzt erstellten Fades gestartet hat. –

+0

Nun * das * klingt wie eine Lösung und entfernt immer das * vorletzte * hinzugefügte Tag, im Gegensatz zu dem, das gerade ausgeblendet wurde. Aber würde das nicht erfordern, dass Sie '[self fadeOutLabels: counter-1]' aufrufen (und die Entfernung nur durchführen, wenn der Zähler> = 0 ist, um das erste Auftreten zu berücksichtigen)? Wie es ist, markieren Sie * und * Fading für den inkrementierten Zähler. – Wienke