OK、私はここSOのさまざまな投稿に基づいてこれを行う方法を理解しました、そしてそれは素晴らしい働きをします。私は、小さな領域を除いて基本的にウィンドウ全体をマスクするオーバーレイに取り組んでいます。これは、私のアプリの特定の領域に注意を引くためのものです。私はたくさんの呼び出しを使用していますmoveToPoint:
(addLineToPoint:
これは私のCALayerサブクラスにあります' drawInContext:
):
....
// inner path (CW)
[holePath moveToPoint:CGPointMake(x, y)];
[holePath addLineToPoint:CGPointMake(x + w, y)];
[holePath addLineToPoint:CGPointMake(x + w, y + h)];
[holePath addLineToPoint:CGPointMake(x, y+h)];
// outer path (CCW)
[holePath moveToPoint:CGPointMake(xBounds, yBounds)];
[holePath addLineToPoint:CGPointMake(xBounds, yBounds + hBounds)];
[holePath addLineToPoint:CGPointMake(xBounds + wBounds, yBounds + hBounds)];
[holePath addLineToPoint:CGPointMake(xBounds + wBounds, yBounds)];
// put the path in the context
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0, 0);
CGContextAddPath(ctx, holePath.CGPath);
CGContextClosePath(ctx);
// set the color
CGContextSetFillColorWithColor(ctx, self.overlayColor.CGColor);
// draw the overlay
CGContextDrawPath(ctx, kCGPathFillStroke);
(holePath
のインスタンスですUIBezierPath
。)
ここまでは順調ですね。次のステップはアニメーションです。これを行うために(私はここSOでもこのテクニックを見つけました)私は次のような方法を作りました
-(CABasicAnimation *)makeAnimationForKey:(NSString *)key {
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:key];
anim.fromValue = [[self presentationLayer] valueForKey:key];
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.duration = 0.5;
return anim;
}
actionForKey:
、initWithLayer:
および( inneedsDisplayForKey:
の結果を返します。これで、暗黙のCAAnimationsを使用してアニメーション化できるプロパティを持つ素敵な「穴レイヤー」が得られます!残念ながら、それは非常に途切れ途切れです。1秒あたり2または3フレームのようなものが得られます。おそらく問題は背景にあると思い、それをスナップショットに置き換えようとしましたが、サイコロはありませんでした。次に、Instrumentsを使用してプロファイルを作成し、ここでの巨大な豚がへの呼び出しであることを発見しました。makeAnimationForKey:
actionForKey:
holeRect
CGContextDrawPath()
tl; dr私の質問はこれに帰着すると思います:より速く再描画される穴のあるこのレイヤーを作成するより簡単な方法はありますか?私の勘は、使用しているパスを単純化できれば、パスの描画が軽くなるということです。またはおそらくマスキング?助けてください!