2012-01-18 6 views
1

私は単純なカスタムUIView(矩形)がdrawRectで実装されています。アニメーションカスタムUIView

ビューは2つの値から取得されます。 drawRectからcurrentValueはとmaxValueの

RECTの高さがcurrentValueはがmaxValueのであるどれだけ表します

if(currentValue > maxValue) 
    currentValue = maxValue; 

float scale = currentValue/maxValue; 

//Draw the rect 
CGContextBeginPath(context); 
CGContextMoveToPoint(context, self.bounds.origin.x, self.bounds.size.height); 
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height); 
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height-(self.bounds.size.height*scale)); 
CGContextAddLineToPoint(context, self.bounds.origin.x, self.bounds.size.height-(self.bounds.size.height*scale)); 
CGContextClosePath(context); 

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); 
CGContextFillPath(context); 
CGContextStrokePath(context); 

私はcurrentValueはを変更UISliderとセットアップのViewControllerをしましたし、それが変更されるたびにsetNeedsDisplayが呼び出されます。この部分はうまく動作します。スライダが使用されているときは、まっすぐに高さが変更されます。

私の質問は..私はこの高さをアニメーション化するのが欲しいです。それを行う最良の方法は何ですか?

ありがとうございました

答えて

1

カスタム描画でUIViewを使用する代わりに、CAShapeLayerオブジェクトをビューのレイヤーに追加できます。 CAShapeLayerクラスでは、属性を描画および描画するパスを指定できます。また、これらのプロパティの変更は簡単にアニメーション化できます。

ビューが単色で塗りつぶされている場合、2番目のオプションはビューのフレームを調整するか、適切なアフィン変換を設定して高さを取得することです。これらのプロパティはUIViewクラスのアニメーションメソッドを使用して簡単にアニメーション化できます。

+0

ありがとう、私は単純なUIView rectを使用して、UIView animateWithDuration ..の代わりにフレームを変更してしまいました。 – Jach0

0

これはおそらくCore Animationで行います。関連するドキュメントはAppleのdeveloper siteです。このother SO questionには、Core AnimationとiOSのリンクがあります。

1

あなたは本当にただ(CAShapeLayerまたはCAGradientLayerなど)Core Animationの層によって描画することができ、単純な形状をしたい場合は、あなただけのレイヤーのフレームをアニメーション化するCore Animationの層とCABasicAnimationを使用する必要があります。

もっと複雑なものを描画する予定で、シェイプの変更をアニメートする場合は、より多くの作業を行う必要があります。現在の値と最終的な値を格納するオブジェクトのプロパティやインスタンス変数を与え、値の速度を格納する必要があります。 CADisplayLinkオブジェクトを作成し、それを使用してアニメーションメソッドへの呼び出しを駆動する必要があります。あなたのアニメーションメソッドは、経過した時間に基づいて現在の値を更新してから、setNeedsDisplayを呼び出す必要があります。