2012-02-17 9 views
0

現時点では、drawRectの内側にCGContextClipToMaskを使用して色付きの矩形をクリップするために、ビュー内でdrawRectをオーバーライドしています。 時々、この切り抜かれた矩形の色を変更します。この場合、drawRectが再び呼び出され、新しい色の矩形が再描画され、クリップされます。 今私は色を一度に変更したくないが、これをアニメーション化する。問題は、drawRectをオーバーライドするときにアニメーションが実行されないことです(drawRectは1回だけ呼び出され、すぐに呼び出されます)。クリッピング時にdrawRectをオーバーライドしないようにする方法

スーパークラスのdrawRectをオーバーライドするように、このアニメーションを実行する方法がありますか。サブクラスを介して何らかの形でアニメーションが実行されるため、スーパークラスのdrawRectが複数回実行されます。アニメーション?

また、drawRectをオーバーライドしないでも、この矩形を何らかの方法でクリップできますか? drawRectは次のようになります。

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGImageRef maskImage = [[UIImage imageNamed:maskName] CGImage]; 
CGContextClipToMask(ctx, rect, maskImage); 

CGContextSetFillColorWithColor(ctx, self.currentColor); 
CGContextFillRect(ctx, rect); 

答えて

0

が、私はあなたのビューをマスクするのCALayerを使用することをお勧めだと思います(QuartzCoreをインポートすることを忘れないでください):

maskLayer.contents = (id)[UIImage imageNamed:maskName].CGImage; // maskLayer is a CALayer 
view.layer.mask = maskLayer; 

を今、あなたはあなたのビューコントローラ方法-(void)animateを持っていると仮定すると、あなたはそれを実行していタイマを使用して複数回、またはperformSelector:withObject:afterDelayへの再帰呼び出しを使用します。

+0

あなたのアプローチでは、私は最後にアニメーションを使用できるようにdrawRectをオーバーライドする必要はありませんでした。私は今、標準のCoreAnimationを使うことができるので、タイマーを使う必要もなく、アニメーションメソッドを再帰的に実行する必要もありませんでした。どうもありがとう!注目すべきことは、png画像やクリアカラーの画像を使用する必要があることです(黒と白のマスクはもう使えませんが、問題はありません)。また、maskLayer.frame = [self bounds]を使用して、マスクするビューの境界にレイヤーフレームを設定する必要があります。 – JayAr

0

一つの解決策は、色が変更されるたびに時間をかけて繰り返し再描画するために発射し、タイマーを持っていることであろう。ユーザーが新しい色を選択すると、起動するNSTimerにスターを付けます(たとえば、10x秒)。タイマーが起動すると、開始カラーから終了カラーまで途中になるように現在のカラーを更新し、ビューを無効にします。最終的な色に達したら、タイマーを殺す。

+0

ありがとう、それは動作するはずですが、何とか(アニメーション)ホイールを再発明するようにも聞こえます。もし他のオプションがないなら、私はこれを使用します。 – JayAr

関連する問題