2012-03-19 4 views
9

HOLLOW CGPath의 외측 가장자리 주위에 그림자를 추가하고 싶습니다 (두 단어는 중요 : 외곽 + 중공 :).CALayer.shadow에 의해 생성 된 그림자 클리핑

Apple의 그림자 구현은 "채워진"그림자 만 허용합니다.

그래서 ... 그림자 자체 안쪽 부분을 어떻게 제거 할 수 있습니까? 그것이 렌더링 호출이라면, CGContextSetClip * 메소드를 호출하여 원하는 곳으로 클립 할 수 있습니다 ... 그러나 렌더링 호출이나 CALayer가 아니기 때문에 어떻게 접근 할 수 있는지 알 수 없습니다. .

(애플의 불행한 결과는 같아요, 마법 변수 세트로 "숨어"?)

NB :이 아이폰 OS 만 - 맥 IIRC 당신은 그림자를 만드는 데 사용되는 필터에 직접 액세스 할 수 , 당신은 직접 (임의의) 그림자를 만들 수 있습니다.


업데이트 : 그림자의 안쪽 부분을 보여 클립하는 방법 일

: (즉, "layer.mask"로 설정 현재 레이어의 클론의 새 레이어로 즉 같은 경로), 경로 채우기 색상을 전체 알파로 설정하십시오.

이것은 내가 시도하는 것과 반대입니다. 따라서 알파를 플립하기위한 마스크 레이어를 얻는 방법을 생각해 보면 (0은 1이되고 1은 0이됩니다.) ...

당신을 가정

답변

5

는 방법이 있습니다

-(CAShapeLayer*) cloneShapeLayer; // creates a new CAShapeLayer and copies the values 

... 다음을 수행하십시오

  1. 복사 층은 "마스크"
  2. 테이크 마스크 생성 - 동일 CGPath을 기억 - 및 교체의 아빠 가지고 경로 : 제 (
    1. 일본어 층의 마스크를 설정 (EO의 규칙을 사용하여 달성) 전체 층
    2. MINUS 원래 경로
  3. 의 RECT을

    CAShapeLayer* maskLayer = [originalLayer cloneShapeLayer]; 
    // got to make it a bit bigger if your original path reaches to the edge 
    // since the shadow needs to stretch "outside" the frame: 
    CGFloat shadowBorder = 50.0; 
    maskLayer.frame = CGRectInset(maskLayer.frame, - shadowBorder, - shadowBorder); 
        maskLayer.frame = CGRectOffset(maskLayer.frame, shadowBorder/2.0, shadowBorder/2.0); 
    maskLayer.fillColor = [UIColor blackColor].CGColor; 
    maskLayer.lineWidth = 0.0; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    
    CGMutablePathRef pathMasking = CGPathCreateMutable(); 
    CGPathAddPath(pathMasking, NULL, [UIBezierPath bezierPathWithRect:maskLayer.frame].CGPath); 
    CGAffineTransform catShiftBorder = CGAffineTransformMakeTranslation(shadowBorder/2.0, shadowBorder/2.0); 
    CGPathAddPath(pathMasking, NULL, CGPathCreateCopyByTransformingPath(maskLayer.path, &catShiftBorder)); 
    maskLayer.path = pathMasking; 
    
    shapeLayer.mask = maskLayer; 
    
    : 그림자 하나는) 새 레이어 "마스크"

즉 코드에있을

NB : 그림자가 실제로 마스킹하지 않았을 때와 비교하여 약간 확대 된 것 외에는 실제로 작동합니다. 오 잘.

+0

나는 이것을 시도했지만, 내 레이어에는 아무런 변화가 없으며, 당신은'shadowBorderWidth'를 정의하지 않았다. 그게 무슨 뜻이야? –

+0

코드를 변경했습니다. 나는 그것이 여전히 효과가 있을지 모른다, 아마도 것입니다. 작동하지 않으면 cloneShapeLayer 메서드, CGPath의 굴곡 규칙, 원래 CGPath 자체 등을 디버깅 할 수 있습니다.이 작업은 소스 코드와 이미지 데이터에 크게 의존합니다 - 내가 너를 위해 그것을 디버깅 할 수는 없어. – Adam

+0

고마워요, 이걸 시도 할게요 :) –

관련 문제