用静态方法在UIView(切割孔)上用清晰的颜色绘图
我有一个iPhone应用程序,我需要实现以下方法:
+(UITextView *)textView:(UITextView *) withCuttedRect:(CGRect)r
这个方法必须从UITextView
剪切(用[UIColor clearColor]
填充)rect r
并返回UITextView
对象。
用户将从切割孔中看到UITextView
背后的视图。
如何做呢?
当你有这样的事情:
+(UITextView *)textView:(UITextView *)textView withCuttedRect:(CGRect)r { }
你实际上可以简单地使用核心animation访问textview的图层
textView.layer
然后你可以设置一个面具剪辑。 这些面具的工作方式如下:你通常画一个黑色的形状,并保持不变,其余的将被裁剪(好吧,你实际上也可以在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;
上面的代码也是裁剪一个CAShapeLayer检索外部path
Quartz 2D编程指南在“填充path”一节中很好地解释了这种填充工作的原理,