2012-01-25 10 views
3

UIViewのCoreGraphicsコンテンツをアニメーション化することはできますか?UIViewのCoreGraphics/drawRectコンテンツにアニメ化

は、私はそうのようなdrawRect:メソッドを実装MyView呼ばUIViewサブクラスがあるだろう。つまり

- (void) drawRect: (CGRect) rect { 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(c, someColor); 
    CGContextSetLineWidth(c, someWidth); 
    CGContextMoveToPoint(c, leftOfMyUIView, topOfMyUIView); 
    CGContextAddLineToPoint(c, leftOfMyUIView, bottomOfMyUIView); 
    CGContextStrokePath(c); 
} 

を - それはUIViewのサブクラスの私の左手側を下に垂直線を描画します。このUIViewをアニメーション化して、行がビューの左側から右側に移動するようにする簡単な方法はありますか?私はそれを左から右に「ドリフト」したいと思います。

私は移動しない理由のために明確にするために、MyViewのインスタンスを移動/アニメーションできません。私が考えることができる最良の解決策は、新しいUIViewサブクラスを追加することです。何かLineView extends UIViewのようなものを作成し、私が描画したい線の正確な寸法をLineViewにして、独自のdrawRectメソッドを使用して塗りつぶし、次にLineViewのインスタンスをサブビューとしてMyViewに追加します。これにより、アニメーションブロックを使用してLineViewオブジェクトの位置をアニメートすることができますが、非常に単純なものを達成するにはあまりにも複雑に思えます。

+0

あなたのアップデートは、私が最初にこの質問を見たときに示唆していた答えです... drawRectはアニメーションではなく、単一の時点で描画するためのものです。ビューのプロパティをアニメーション化します(この場合は 'center')。あなたのラインをサブビューやサブレイヤにする(CAShapeLayerは簡単に思い浮かばります)、それを動かすのが唯一の方法です。 – jrturton

+0

私が取り組んでいる問題は、これらの 'LineView'インスタンスの多く(hundereds)を作成する必要があることを意味します。私は、各行の位置をアニメーション化するより複雑なことはしません。あなたの2つの提案( 'UIView'や' CALayer')のどれがこの文脈に最も適しているのでしょうか?彼らの間にパフォーマンスが重視されていますか? – Barjavel

+0

CAShapeLayerが最適です。新しいビューをまったく作成していない場合は、ビューのプロパティに過ぎません。 – jrturton

答えて

0

数百のLineViewインスタンスが存在するというあなたのコメントに基づいて、UIViewサブクラスではなくCALayerサブクラスを使用するのが最適かもしれません。 UIViewオブジェクトはイベント処理を行い、iOSでは各UIViewはレンダリングを処理するCALayerを所有しています。個々の行にイベントトラッキングを必要としたくない場合は、それらのUIViewインスタンスはおそらく不必要なオーバーヘッドです。親のUIViewのレイヤーにアクセスし、必要に応じてラインのサブレイヤーを追加することができます。

問題が正しく理解されていれば、CoreGraphicsは必要ありません。塗りつぶしを処理するために、線レイヤのbackgroundColorを設定することができます。また、線が直線でない場合は、線のパスをレンダリングするためにCAShapeLayerを使用できます。

関連する問題