あなたが次のようなものを持っているとき:
+(UITextView *)textView:(UITextView *)textView withCuttedRect:(CGRect)r {
}
実際には、コアアニメーションからtextviewのレイヤーに簡単にアクセスできます。
textView.layer
次にできることは、クリッピング用のマスクを設定することです。これらのマスクは次のように機能します。通常、黒い形状を描画しますが、それは同じままで、残りはクリップされます(実際には、アルファチャネルでいくつかのことを実行できますが、大まかに言ってそれだけです)。
したがって、マスクとして黒い長方形が必要です。長方形の中には自由な長方形があります。そのためにあなたはおおよそすることができます
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をクロップすることによっても使用されません
その充填がそのように機能する理由は、Quartz2Dプログラミングガイドの「パスの充填」セクションでうまく説明されています。