2012-03-19 11 views
9

Chcę dodać cień wokół zewnętrznej krawędzi CGPath HOLLOW (te dwa słowa są krytyczne: poza + pusty)).Cienie przycinające utworzone przez CALayer.shadow

Wdrożenie cienia Apple pozwala tylko na "wypełnione" cienie.

Więc ... jak wyciąć wewnętrzną część samego cienia? Gdyby to było wywoływanie renderowania, nazwałbym CGContextSetClip * metody, aby spiąć go tam, gdzie chciałem ... ale nie widzę, jak byś się do tego przyzwyczaił, ponieważ nie jest to ani wywołanie renderowania, ani sam CALayer .

(niefortunna konsekwencja Apple „ukrywanie” go jako zbiór zmiennych magicznych, myślę?)

Uwaga: to iOS tylko - IIRC na Mac masz bezpośredni dostęp do filtrów stosowanych do tworzenia cieni , dzięki czemu możesz tworzyć własne (dowolne) cienie ręcznie.


UPDATE:

pracowałem się, jak przycinać, aby pokazać tylko wewnętrzna część cieniu: ustawić „layer.mask”, aby być nowa warstwa, która jest klonem bieżącej warstwy (tj. ta sama ścieżka) i ustawić kolor wypełnienia ścieżki na cokolwiek z pełną alfa.

Jest to przeciwieństwo tego, co próbuję, więc gdybym mógł wymyślić sposób, aby uzyskać warstwę maski, aby odwrócić alfa (0 staje się 1, 1 staje się 0), będę tam ...

Odpowiedz

5

zakładając, że masz sposób:

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

... wtedy to zrobić:

  1. skopiować warstwę, tworząc "maskę"
  2. Take maskę - tak samo CGPath, pamiętam - i zastąpienie jej rocznie th ze ścieżką których:
    1. rect całej warstwy
    2. minus oryginalnej ścieżki
    3. (osiągnięty przy zastosowaniu zasady EO)
  3. ustawienie maski pierwotnej warstwy (The jeden z cienia) jest nowa warstwa „maska”

tj kodu:

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; 

Uwaga: to faktycznie działa, z tym wyjątkiem, że cień wydaje się być powiększony trochę w porównaniu do tego, kiedy nie maskowałam. No cóż.

+0

Próbowałem tego, ale nic nie stało się z moją warstwą, a ty nie zdefiniowałeś 'shadowBorderWidth'. Co to znaczy? –

+0

Zmieniłem kod. Nie wiem, czy to jeszcze zadziała, prawdopodobnie będzie. Jeśli to nie działa, masz do wyboru dużo debugowania: metodę cloneShapeLayer, regułę zwijania w CGPath, oryginalną CGPath itd. Jest to bardzo zależne od TWOJEGO kodu źródłowego i SWOICH danych obrazu - Nie mogę tego debugować. – Adam

+0

Dziękuję, spróbuję tego :) –

Powiązane problemy