6

我有一个 iPhone 应用程序,我需要实现以下方法:

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

此方法必须剪切(填充[UIColor clearColor])矩形rUITextView返回UITextView对象。

UITextView用户将从切割的孔中看到后面的视图。

怎么做到呢?

4

1 回答 1

6

当你有类似的东西时:

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

你实际上可以简单地从核心动画访问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;

上面的代码也被Crop a CAShapeLayer 检索外部路径废弃

Quartz 2D Programming Guide中的“Filling a Path”部分很好地解释了填充以这种方式工作的想法

于 2012-06-20T07:35:30.263 回答