2011-06-14 30 views
6

私はUIlabelをアニメーション化して最初に大きくして元のフレームに戻します。予想どおりに作業を拡大しますが、縮小しません。下のコードでラベルを縮小すると、原点が移動する前にサイズが最初に調整されます。これにより、滑らかではない2段階アニメーションが発生します。あなたのアニメーションブロック内のラベルへの変換を適用する代わりに矩形を調整してみてくださいアニメーションUILabelがスムーズでない

CGRect rect = label.frame; 
[UIView animateWithDuration:.2 
         delay: 0.1 
        options: UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        label.frame = CGRectMake(rect.origin.x + 4, 
                     rect.origin.y + 4, 
                     rect.size.width-8, 
                     rect.size.height-8); 
       } 
       completion:^(BOOL finished){ 
       }]; 
+0

は、あなたが移行をやっていない乾杯...です。なぜあなたは 'UIViewAnimationOptionTransitionNone'を使用していますか? –

+0

奨励金を渡すことを忘れないでください:) – jmosesman

答えて

2

は、ここに私のコードです。成長/縮小アニメーションのための次の行のようなもの:

label.transform = CGAffineTransformMakeScale(1.5, 1.5); //grow 
label.transform = CGAffineTransformMakeScale(1, 1);  //shrink 
2

このソリューションをトライアウトしてください、私はそれはあなたが探しているものであると思います。私は仕事のためにそれをテストしましたが、あなたがこれを探しているかどうか試してみてください。

-(IBAction)growanimate:(id)sender 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkanimate)]; 
    label.transform = CGAffineTransformMakeScale(2.0f, 2.0f); //This will double label from current size. 
    [UIView commitAnimations]; 
} 

-(void)shrinkanimate 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    label.transform = CGAffineTransformMakeScale(1.0f, 1.0f); //This will get it back to original size. 
    [UIView commitAnimations]; 
} 
+0

thx..より詳細なバージョンについては、以前の回答があります – prostock

1

問題は、フレームのサイズ変更がサイズ変更通知をトリガーするという事実に起因すると考えられます。スーパービューの新しい領域が明らかになるため、縮小すると中断が増える可能性があります。

この場合、変換方法がはるかに優れています。

また、変換方法では、グリフのパスとレイアウト(改行など)は再計算されず、CGPathはレンダリング時に単純に変換されます。


センタリングの問題については、何も問題はありません。

このエフェクトを幅広く使用する予定の場合は、このエフェクトの静的クラスを作成するか、静的に格納されたトランスフォームを内部に含むプリセットアニメーションをいくつか含めることができます。

[MyPopEffect popView:mylabel]などの呼び出しを行います。

変換の作成と解放を避けることができ、任意のビューや他のプロジェクトで即座に使用できます。

とにかく、ここでアニメーションのコードが

[

UIView animateWithDuration:0.5f delay: 0.0f 
    options:UIViewAnimationOptionCurveEaseOut+UIViewAnimationOptionBeginFromCurrentState 
     animations:^{ 
      label.transform=CGAffineTransformMakeScale(2.0f,2.0f); 
     } 
    completion:^(BOOL finished){ 
      [UIView animateWithDuration:0.5f delay: 0.0f 
      options:UIViewAnimationOptionCurveEaseIn+UIViewAnimationOptionBeginFromCurrentState 
      animations:^{ 
       label.transform=CGAffineTransformMakeScale(1.0f,1.0f); 
      } 
      completion:^(BOOL finished){}]; 
    }]; 

]

関連する問題