2012-06-13 9 views
6

Mam aplikacji iPhone i muszę wdrożyć następujące metody:rysunku z jasnym kolorem na UIView (wycięcie otworu) w metodzie statycznej

+(UITextView *)textView:(UITextView *) withCuttedRect:(CGRect)r 

Metoda ta musi wyciąć (wypełnić [UIColor clearColor]) rect r od obiektu UITextView i powrotu obiektu UITextView.

Użytkownik zobaczy widok za UITextView ze skróconych otworów.

Jak to zrobić?

+0

Może Powinienem użyć quartzcore i to jest metoda 'setBackground' filters? – user1385666

Odpowiedz

5

Kiedy masz coś takiego:

+(UITextView *)textView:(UITextView *)textView withCuttedRect:(CGRect)r { 
} 

rzeczywiście może po prostu dostępu Warstwa TextView jest z animacją rdzenia z

textView.layer 

Co wtedy można by się ustawić maskę odcinania. Te maski działają w następujący sposób: generalnie rysujesz czarny kształt, który pozostaje taki sam, reszta zostanie obcięta (ok, możesz nawet zrobić kilka rzeczy na kanale alfa, ale z grubsza to jest to).

Potrzebujesz czarnego prostokąta jako maski, z prostokąta w prostokącie, który jest wolny. dla których można w przybliżeniu zrobić

CAShapeLayer *mask = [[CAShapeLayer alloc] init]; 
mask.frame = self.textView.layer.bounds; 
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height); 
CGRect smallerRect = CGRectMake(50.0f, 50.0f, 10.0f, 10.0f); 

UIBezierPath *maskPath = [UIBezierPath bezierPath]; 
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))]; 

[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))]; 
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))]; 

mask.path = maskPath.CGPath; 
[mask setFillRule:kCAFillRuleEvenOdd]; 
mask.fillColor = [[UIColor blackColor] CGColor]; 
self.textView.layer.mask = mask; 

Powyższy kod jest również nieużywane przez Crop a CAShapeLayer retrieving the external path

Pomysł dlatego, że wypełnienie działa w ten sposób jest ładnie wyjaśnione w Quartz 2D Programming Guide w sekcji „Wypełnianie ścieżki”

+0

Nice! I po prostu notatka, dla zrobienia tego samego z "CGContext", dodajesz ścieżkę tak jak Ty, a następnie wypełnisz ją 'CGContextEOFillPath (context)'. :) Gdzie EO oznacza nawet dziwne, nie mylić z EndOfFile (tak to skanuje dla mnie). –

+1

Można przyciąć kilka linii kodu, używając '[UIBezierPath bezierPathWithRect: biggerRect]' zamiast podstawowego '[UIBezierPath bezierPath]'. Spowoduje to zainicjowanie maski maskPath z wcześniejszym dodaniem większego elementu. W ten sposób wystarczy użyć moveToPoint: i addLineToPoint: aby dodać drugi rect. –