我有一個iPhone應用程序,我需要實現以下方法:與UIView的清晰的彩色圖紙(切一個洞)的靜態方法
+(UITextView *)textView:(UITextView *) withCuttedRect:(CGRect)r
這種方法必須削減(與[UIColor clearColor]
填充)矩形r
從UITextView
並返回UITextView
對象。
用戶將從切割孔中看到UITextView
背後的視圖。
怎麼辦?
我有一個iPhone應用程序,我需要實現以下方法:與UIView的清晰的彩色圖紙(切一個洞)的靜態方法
+(UITextView *)textView:(UITextView *) withCuttedRect:(CGRect)r
這種方法必須削減(與[UIColor clearColor]
填充)矩形r
從UITextView
並返回UITextView
對象。
用戶將從切割孔中看到UITextView
背後的視圖。
怎麼辦?
當你有這樣的事情:
+(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很好地解釋「填補了路徑」
不錯!只需要注意,爲了對CGContext進行同樣的操作,您可以像添加路徑一樣添加路徑,然後使用'CGContextEOFillPath(context)'填充路徑。 :) EO意味着甚至是奇怪的,不要與EndOfFile(它是如何掃描我的)混淆。 –
您可以通過使用'[UIBezierPath bezierPathWithRect:largerRect]'而不是基本的'[UIBezierPath bezierPath]'來修剪幾行代碼。這將使用預先添加的greaterRect初始化maskPath。這樣你只需要使用moveToPoint:和addLineToPoint:來添加第二個矩形。 –
也許這個想法廢棄我應該使用quartzcore,它是'setBackground'過濾器方法? – user1385666