좋아, 나는 여기에 여러 게시물을 기반으로 이렇게하는 방법을 알아 냈어, 그리고 그것은 잘 작동합니다. 나는 기본적으로 작은 영역을 제외한 전체 창을 마스크하는 오버레이에서 작업하고 있습니다. 이것은 내 애플 리케이션의 특정 영역에 관심을 끌기위한 것입니다. 나는 (이 내의 CALayer 하위 클래스 'drawInContext:
에)과 같이 moveToPoint:
및 addLineToPoint:
에 통화의 무리를 사용하고 있습니다 :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:
의 결과를 반환하는 방법을 만들어 (나는 또한 여기에 SO에이 기술을 발견). 자, 내가 좋은 수 "홀 레이어"는 암시적인 CAAnimations를 사용하여 애니메이션 가능하게하는 holeRect
속성을 가지고 있습니다! 불행히도, 그것은 고르지 않습니다 .2 또는 3 프레임/초 같은 것을 얻을 수 있습니다. 아마도 배경이 문제라고 생각하고 스냅 샷은 없지만 주사위는 없었습니다. 그런 다음 인스트루먼츠를 사용하여 프로필을 작성하고 큰 돼지는 여기 CGContextDrawPath()
에 대한 호출임을 알게되었습니다 ..
tl; dr 내 생각에 내 질문은 다음과 같습니다. 더 빨리 다시 그릴 구멍이있는이 레이어를 만드는 더 간단한 방법이 있습니까? 내 직감은 내가 사용하고있는 경로를 단순화 할 수 있다면 길을 그리는 것이 더 가볍다는 것입니다. 아니면 마스킹을할까요? 도와주세요!
심각하게? 아무도 이것에 대해 아무 말도하지 않습니까? 내 질문이 너무 길어? – samson
CAShapeLayer를 사용하고 경로에 애니메이션을 적용 해보십시오. – Felix
CAShapeLayer에 구멍이있을 수 있습니까? – samson