2012-02-11 1 views
3

이미지가 있고 (실제로는 원형입니다) 두 동심원 사이의 영역에 해당하는 이미지 부분 만 그려야하고, 바깥 쪽은 고정, 내부 하나 크기를 조정할 수 있습니다.Xcode/objective-c의 두 동심원 사이의 영역에 이미지를 그립니다.

외부 동심원은 항상 이미지의 바깥 쪽 가장자리에 해당하지만 더 작은 동심원의 크기에 해당하는 "구멍"을 그려야합니다.

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! 이것은 훌륭하게 작동했습니다. 내 기하학에 약간 녹슬었고 (매우 녹슬 었음), 이것이 큰 도움이되었습니다. 베드로 –

관련 문제