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

問題は、プロセッサに連続してあまりにも多くのアニメーションを実行するように要求している、および/またはアニメーションがイベント ループ内の他のプロセスによって中断されている可能性があります。このようなタイミングの問題は、遅延を挿入することで解決できることがよくあります。

で置き換え[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

これが動作するように見えるコードです。作成中の個々のラベルを明示的に参照できるように、ラベルにタグを追加する必要がありました。アルファ値を .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 に答える
0

メソッドを省略することremoveFromSuperviewで主な問題を解決しましたfadeOutLabelsが、これらのラベルが蓄積され、メモリを占有します。そして、リリースを提供せずに割り当てを行うことで、最初にリークが発生しました。

これらの 2 つの変更により、既に到達したソリューションが完成する可能性があると思います。

1) 「myLabel」という UILabel のプロパティを作成します。

2)gestureLabelAppearおよびfadeOutLabelsこれに変更します。

- (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 に答える