2011-10-20 10 views
5

Mam zestaw widoków w karuzeli, każdy przy użyciu CAGradientLayer jako tło. Karuzela siedzi nad teksturą tle. Zostałem poproszony o tło, aby zagrzebać się w trójkącie, aby pokazać wybrany widok. Nie mogę po prostu użyć trójkątnego obrazu z teksturą tła, ponieważ niekoniecznie będzie to pasowało do głównego tła. Chciałbym wyciąć wycięcie z tła bieżącego widoku, aby teksturowane tło było widoczne przez wycięcie.Jak wyciąć wycięcie z CALayer?

Jak powinienem to zrobić? Czy możliwe jest wykonanie wielobokowej warstwy?

Odpowiedz

10

znalazłem udało mi się to zrobić za pomocą CAShapeLayer:

CAShapeLayer *mask = [[[CAShapeLayer alloc] init] autorelease]; 
mask.frame = backgroundLayer.bounds; 
mask.fillColor = [[UIColor blackColor] CGColor]; 

CGFloat width = backgroundLayer.frame.size.width; 
CGFloat height = backgroundLayer.frame.size.height; 

CGMutablePathRef path = CGPathCreateMutable(); 

CGPathMoveToPoint(path, nil, 0, 0); 
CGPathAddLineToPoint(path, nil, width, 0); 
CGPathAddLineToPoint(path, nil, width, height); 
CGPathAddLineToPoint(path, nil, (width/2) + 5, height); 
CGPathAddLineToPoint(path, nil, width/2, height - 5); 
CGPathAddLineToPoint(path, nil, (width/2) - 5, height); 
CGPathAddLineToPoint(path, nil, 0, height); 
CGPathAddLineToPoint(path, nil, 0, 0); 
CGPathCloseSubpath(path); 

mask.path = path; 
CGPathRelease(path); 

backgroundLayer.mask = mask; 
-3

Czy można wykonać warstwę wieloboku?

nr

Jak mam iść na ten temat?

Użyj maski - obraz png, który ma taki sam rozmiar jak twoja warstwa, ale jest nieco wycięty - to sprawi, że CALayer będzie wyglądał na wyciętego z niego kawałka. (Jednak tak nie będzie, jeśli wycięcie jest duże, może pojawić się sytuacja, w której użytkownicy próbują dotknąć tego, co za tym stoi, co nie zadziała!).

Aby uzyskać więcej informacji, zobacz numer documentation (i wyszukaj numer stackoverflow).

+0

nie mogę użyć maski PNG - widok jest dynamicznie wielkości. – Simon

+0

Utwórz maskę dynamicznie za pomocą interfejsów API do rysowania Quartz - http://www.codeproject.com/KB/iPhone/iOSGetStarted01.aspx – deanWombourne

+0

Jest to właściwie uzasadniona odpowiedź, ponieważ warstwa jako taka jest zawsze prostokątem (dokumentacja Apple), więc obraz .png jest wykonalnym rozwiązaniem. –

0

Nie sądzę, że możemy rysować wieloboczne warstwy. Uważam jednak, że oczekiwany rezultat można osiągnąć stosując dwa różne sposoby: - ​​

  1. Jeśli obrazy są tej samej wielkości, a następnie można użyć obrazu PNG z przezroczystym wycięcie pomiędzy (lub na zewnątrz, jak na swoje pragnienie).

  2. Narysuj wypełniony prostokąt i przezroczysty trójkątny wielokąt. Następnie musisz przeciąć zarówno wielokąt (prostokąt i trójkąt). Wynikowy kształt należy umieścić nad obrazkiem karuzeli. Zaletą tej metody jest to, że w razie potrzeby można dynamicznie zmieniać wielkość i kształty wielokątów.

Mam nadzieję, że to pomoże!