6

iPhoneアプリケーションがあり、次のメソッドを実装する必要があります。

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

このメソッドは、オブジェクトから[UIColor clearColor]rectを切り取り(塗りつぶし)、オブジェクトを返す必要があります。rUITextViewUITextView

UITextViewユーザーは、切り取られた穴から後ろの景色を見ることができます。

どのようにそれを行うことができますか?

4

1 に答える 1

6

あなたが次のようなものを持っているとき:

 +(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プログラミングガイドの「パスの充填」セクションでうまく説明されています。

于 2012-06-20T07:35:30.263 に答える