2012-06-13 29 views
6

我有一個iPhone應用程序,我需要實現以下方法:與UIView的清晰的彩色圖紙(切一個洞)的靜態方法

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

這種方法必須削減(與[UIColor clearColor]填充)矩形rUITextView並返回UITextView對象。

用戶將從切割孔中看到UITextView背後的視圖。

怎麼辦?

+0

也許這個想法廢棄我應該使用quartzcore,它是'setBackground'過濾器方法? – user1385666

回答

5

當你有這樣的事情:

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

你實際上可以

textView.layer 

什麼,然後你可以設置爲裁剪口罩從核心動畫只需訪問的TextView的層。這些蒙版的工作方式如下:通常繪製一個黑色的形狀,並保持不變,其餘部分將被剪裁(好吧,您實際上也可以在Alpha通道上做一些事情,但大致就是這樣)。

所以你需要一個黑色的矩形作爲一個面具,矩形內的矩形是免費的。對,你可以大致做

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; 

上面的代碼也被Crop a CAShapeLayer retrieving the external path

爲什麼填土工程這種方式是在部分Quartz 2D Programming Guide很好地解釋「填補了路徑」

+0

不錯!只需要注意,爲了對CGContext進行同樣的操作,您可以像添加路徑一樣添加路徑,然後使用'CGContextEOFillPath(context)'填充路徑。 :) EO意味着甚至是奇怪的,不要與EndOfFile(它是如何掃描我的)混淆。 –

+1

您可以通過使用'[UIBezierPath bezierPathWithRect:largerRect]'而不是基本的'[UIBezierPath bezierPath]'來修剪幾行代碼。這將使用預先添加的greaterRect初始化maskPath。這樣你只需要使用moveToPoint:和addLineToPoint:來添加第二個矩形。 –