2012-06-13 7 views
6

ich eine iPhone-Anwendung habe und ich brauche die folgende Methode zu implementieren:mit klarer Farbe auf UIView Zeichnung in statischer Methode (ein Loch schneiden)

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

Diese Methode dient die rect geschnitten (mit [UIColor clearColor] füllen) muss r von UITextView und zurück UITextView Objekt.

Der Benutzer wird die Ansicht hinter UITextView von den geschnittenen Löchern sehen.

Wie kann es gemacht werden?

+0

Vielleicht Ich sollte Quarzkern verwenden und es ist 'setBackground' Filtermethode? – user1385666

Antwort

5

Wenn Sie so etwas wie haben würde:

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

einfach Sie tatsächlich das Textview die Schicht aus Kern Animation Zugriff mit

textView.layer 

Was Sie dann können, um eine Maske für Clipping eingestellt ist. Diese Masken funktionieren folgendermaßen: Sie zeichnen in der Regel eine schwarze Form, und das bleibt gleich, der Rest wird abgeschnitten (ok, Sie können tatsächlich auch einige Dinge auf dem Alpha-Kanal tun, aber ungefähr das ist es).

Sie brauchen also ein schwarzes Rechteck als Maske, mit einem Rechteck innerhalb des Rechtecks, das frei ist. dafür kann man etwa tun

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; 

Der obige Code auch von Crop a CAShapeLayer retrieving the external path

Die Idee, warum das Füllen schön in dem Abschnitt, in Quartz 2D Programming Guide wird auf diese Weise funktioniert erklärt nicht mehr benützt wird

„einen Pfad Filling“
+0

Schön! Und nur eine Anmerkung, um das Gleiche mit einem 'CGContext' zu tun, fügen Sie den Pfad genauso hinzu wie Sie, und dann füllen Sie ihn mit' CGContextEOFillPath (context) '. :) Wo EO bedeutet auch ungerade, nicht mit EndOfFile verwechselt werden (so scannt es für mich). –

+1

Sie können hier ein paar Zeilen Code abschneiden, indem Sie '[UIBezierPath bezierPathWithRect: biggerRect]' anstelle des einfachen '[UIBezierPath bezierPath]' verwenden. Dies initialisiert den maskPath mit dem zuvor hinzugefügten biggerRect. Auf diese Weise brauchen Sie nur moveToPoint: und addLineToPoint: um das zweite rect hinzuzufügen. –