2012-02-11 9 views
3

私はイメージ(実際には円形)を持ち、2つの同心円の間の領域に対応するイメージの部分のみを描画したいと考えています。内側のものはサイズを調整できます。イメージをXcode/objective-cの2つの同心円の間の領域に描画します

外側の同心円は、常に画像の外側の端に対応しますが、描画される画像には、小さな同心円のサイズに対応する「穴」を残す必要があります。

私はこれをiOS用のobjective-cでしようとしています。可変サイズの「ファインダ」コントロールを描画しています。

ご迷惑をおかけして申し訳ございません。

+0

FWIWは、円形円板が切り取られた円板の用語であり、「円環」である。 – Benjohn

答えて

3

CGContextEOClipを使用する標準的なケースのようなサウンドです。このコードをチェックしていない、しかし、のようなもの:

CGContextRef ctxt = UIGraphicsGetCurrentContext(); 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddEllipseInRect(path, NULL, outerCircle); 
CGPathAddEllipseInRect(path, NULL, innerCircle); 
CGContextEOClip(ctxt); 
//Draw your stuff 
+0

'CGContextEOClip'を使う必要があります。 –

+0

'CGContextEOClip'を使うように修正しました –

1

は、最も簡単でパフォーマンスの高いソリューションは、おそらくUIImageViewを使用して、そのレイヤーのマスクとしてCAShapeLayerを適用することであろう。

例:

UIImage *image = ...; 
CGFloat ringWidth = 20.0; 
CGRect outerCircleRect = CGRectMake(0, 0, image.size.width, image.size.height); 
CGRect innerCircleRect = CGRectInset(outerCircleRect, ringWidth, ringWidth); 
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:outerCircleRect]; 
[path appendPath:[UIBezierPath bezierPathWithOvalInRect:innerCircleRect]]; 
CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.fillRule = kCAFillRuleEvenOdd; 
shapeLayer.path = [path CGPath]; 
UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; 
imageView.layer.mask = shapeLayer; 
[self.view addSubview:imageView]; 

あなたは、これが機能するためにはQuartzCoreフレームワークを含める必要があります。

内側の円の半径を変更すると、シェイプレイヤーに新しいパスを割り当てることができます。これはアニメ化することさえできます。

+0

ありがとう、omz!これはうまくいった。私は幾何学的にちょっと錆びた(非常に錆びている)ので、これは大きな助けとなりました。ピーター –

関連する問題