用静态方法在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”一节中很好地解释了这种填充工作的原理,