2012-06-25 12 views
10
self.myPath=[UIBezierPath bezierPathWithArcCenter:center 
              radius:200 
             startAngle:0 
             endAngle:180 
             clockwise:YES]; 

の逆の経路(これは非常に私はいくつかのグーグルの助けを借りて動作してまで取得することができました。)UIBezierPath

私はこのパスを持っているの取得方法。今私はこの道の逆を埋めるので、この部分を残し、他のすべてを満たしたいと思います。 誰でもコーディングに助けてくれますか?私はこれについて多くの情報を持っていません。

>問題

enter image description here

がジェマル、以前にそれが唯一の赤のストロークで円を示した回答使用した後に表示されている領域。

> NEW EDIT

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor whiteColor]; 
     self.punchedOutPath = 
     [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 400, 400)]; 
     self.fillColor = [UIColor redColor]; 
     self.alpha = 0.8; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [[self fillColor] set]; 
    UIRectFill(rect); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 

    [[self punchedOutPath] fill]; 

    CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
} 

enter image description here

+0

それは完全な円または開いた円形のでしょうか?また、あなたが期待していることのイメージを提供することができますか?それはそれほど美しいものではありませんが、人々があなたに何をしようとしているのか理解してもらえるように助けます。 –

+0

done ..私は賞金をつけたので提供しています – Shubhank

答えて

2

私はあなたのための2つのソリューションを持っています。

  1. このパスをCALayerに描画します。実際にはCALayerのマスクレイヤーとしてCALayerを使用してください。

  2. 弧を追加する前にフレームのサイズで四角形を描きます。

    UIBezierPath *path = [UIBezierPath bezierPathWithRect:view.frame]; 
    [path addArcWithCenter:center 
           radius:200 
          startAngle:0 
           endAngle:2*M_PI 
          clockwise:YES]; 
    

私は、第二の溶液を使用します。 :)

+2

反時計回りに追加する必要がある弧を除いて、2番目の解決策が優れているため、区切りの範囲は[非ゼロ巻き回数規則](https: //developer.apple.com/library/ios/documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF106)(長方形は時計回りの方向に追加されます) 。 –

+0

これは私のために働いていません私は非常に奇妙な結果を得ています。私は質問にそれを追加しました。カインドーを参照してください..thanks – Shubhank

+1

endAngleはラジアン(度ではありません)する必要があります。 360°の円が必要なので、2piまたは6.283です。これを '2 * M_PI'と書くことができます。 –

12

パスを逆にする必要はありません。

clipped out

するのは、あなたが白の面積が75%のアルファを持つ[UIColor whiteColor]になりたいとしましょう:

は、あなたは、本質的に「切り抜く」するビューの部分を持っています。

  • 新しいUIViewサブクラスを作成します。

    @property (retain) UIColor *fillColor; 
    @property (retain) UIBezierPath *punchedOutPath; 
    
  • あなたがこれを行うには、その-drawRect:メソッドをオーバーライドします:

  • このビューには、2つのプロパティがあり

    - (void)drawRect:(CGRect)rect { 
        [[self fillColor] set]; 
        UIRectFill(rect); 
    
        CGContextRef ctx = UIGraphicsGetCurrentContext(); 
        CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    
        [[self punchedOutPath] fill]; 
    
        CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
    } 
    

ここで注意すべき点があります:ビューのfillColorなければならないないがにはアルファ成分が含まれています。あなたのケースでは、それはちょうど[UIColor whiteColor]であることを望みます。次に、[myView setAlpha:0.75]を呼び出してアルファビットを自分で適用します。これは、「宛先アウト」と呼ばれるブレンドモードを使用している:ここで何が起こっている

。数学的にはR = D*(1 - Sa)として定義されていますが、素人の観点から、それは意味の「先のイメージが不透明であるが、元画像は別の場所で透明、透明でどこ先の画像を。」

新しいものは(ベジェパスのすなわち外側の)透明であり、ベジェパスが不透明になるところ、その後、その原料はどこだから、(すなわち、コンテキストですでに何)先を使用するようになるだろう透明になるだろう。しかし、先のものはすでに不透明でなければなりません。不透明でない場合、ブレンドはあなたが望むことをしません。あなたが不透明UIColorを提供し、その後、直接視野にしたい任意の透明性をしなければならない理由です。

  • ウィンドウが
  • fillColor
  • punchedOutPathはエッジからインセット10点だ楕円形である白である[UIColor greenColor]背景を持っています

    は、私はこのような状況で、これを自分で走りましたビューの

    enter image description here

    内部グリーン純粋であり、外側は半透明のオーバーレイを有する:

  • ビューalpha上記のコードで0.75

とを有している、私はこれを得ます。


更新

あなたのカバーは画像ある場合は、新しいイメージを作成する必要があります。しかし、原理は同じです:

UIImage* ImageByPunchingPathOutOfImage(UIImage *image, UIBezierPath *path) { 
    UIGraphicsBeginImageContextWithOptions([image size], YES, [image scale]); 

    [image drawAtPoint:CGPointZero]; 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    [path fill]; 


    UIImage *final = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return final; 
} 

あなたは、この関数の結果を取り、UIImageViewにそれを入れるでしょう。

+0

プロジェクトを私に提供することができますか?お願いします..!私はあなたに質問をクリアする必要があります。それはあなたのために迷惑になるかもしれません! – Shubhank

+0

@shubhank回答のコードは必要なものすべてを説明しています –

+0

こんにちは..私はあなたのメソッドを試しました..私は私のビューの背景を白色に設定しました。あなたは白でなければなりません...ありがとう – Shubhank

14

使用bezierPathByReversingPath。ドキュメント(iOS 6.0以降のみ):

現在のパスの内容が反転した新しいベジェパスオブジェクトを作成して返します。

ので、あなたの道を逆に、あなたがしたいだけ:

UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:center 
                radius:200 
               startAngle:0 
                endAngle:180 
                clockwise:YES]; 
self.myPath = [aPath bezierPathByReversingPath]; 
2

あなたは、ビューコントローラに単一の画面アプリにこれを置くことができます:それは、黄色の背景ビューと青色層の上を行いますその上にマスクで切り取られた楕円形の領域があります。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    // create a yellow background 
    UIView *bg = [[UIView alloc] initWithFrame:self.view.bounds]; 
    bg.backgroundColor = [UIColor yellowColor]; 
    [self.view addSubview:bg];  

    // create the mask that will be applied to the layer on top of the 
    // yellow background 
    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    maskLayer.frame = self.view.frame; 

    // create the paths that define the mask 
    UIBezierPath *maskLayerPath = [UIBezierPath bezierPath]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithRect:CGRectInset(self.view.bounds, 20, 20)]]; 
    // here you can play around with paths :) 
// [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{80, 80}, {140, 190}}]]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, {100, 150}}]]; 
    maskLayer.path = maskLayerPath.CGPath; 

    // create the layer on top of the yellow background 
    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.frame = self.view.layer.bounds; 
    imageLayer.backgroundColor = [[UIColor blueColor] CGColor]; 

    // apply the mask to the layer 
    imageLayer.mask = maskLayer; 
    [self.view.layer addSublayer:imageLayer]; 

} 

これは、同様にこの質問に答えるかもしれません:UIBezierPath Subtract Path

+0

あなたは何をしているのか、その理由を説明できますか?尋ねた人や答えを探している人は、あなたが答えたことを理解するだけです。 – Manuel

+0

"楕円形の領域"が私のために正方形を表示... – zakdances

+0

奇妙な、なぜ[UIBezierPath bezierPathWithOvalInRect:]が楕円を描画しないのですか?空の単一画面プロジェクトにそのコードをコピー&ペーストしましたか? – user511

関連する問題