好吧,我想出瞭如何根據SO上的各種帖子來做到這一點,它的工作原理非常棒。我正在研究一個疊加層,它將基本上掩蓋整個窗口,除了一個小區域。這是爲了吸引關注我的應用程序的特定領域。我使用的是一堆電話來moveToPoint:
和addLineToPoint:
像這樣(這是我的CALayer的子類drawInContext:
):CALayer平滑動畫洞?
....
// 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
一個實例。)
到目前爲止好。下一步是動畫。爲了做到這一點(我也是在這裏找到的所以這種技術),我做了一個方法如下
-(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:
和needsDisplayForKey:
(在actionForKey:
返回的makeAnimationForKey:
結果。現在,我得到一個不錯的「hole layer」,它有一個屬性holeRect
,它可以使用隱式CAAnimations進行動畫處理!不幸的是,它是SUPER波濤洶涌,我得到了像每秒2或3幀的東西,我認爲問題可能是背景,並試圖用快照,但沒有骰子,然後,我使用儀器進行配置,並發現這裏的巨大生豬是撥打CGContextDrawPath()
。
tl; dr我想我的問題歸結爲這個:是否有一種更簡單的方法來創建這個圖層,並在其中創建一個更快的圖層?我的直覺是,如果我可以簡化我使用的路徑,繪製路徑會更輕。或者可能掩蓋?請幫忙!
認真嗎?沒有人對此有何評論?我的問題太久了? – samson
嘗試使用CAShapeLayer併爲路徑設置動畫。 – Felix
CAShapeLayer可以在其中有洞嗎? – samson