2012-01-22 5 views
1

코어 그래픽을 사용하여 임의의 선을 4 픽셀 폭으로 드로잉하겠습니다. 이제이 선을 다른 색상의 1 픽셀 윤곽선으로 만들고 싶습니다. 이 "out of the box"를 달성 할 수있는 CG 기능을 볼 수는 없지만 어떻게 할 수 있는지에 대한 제안을 찾고 있습니다. 이것은 내 기존 코드입니다.코어 그래픽 윤곽선을 사용하여 윤곽선을 그립니다.

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 4.0); 

CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue]; 
CGContextMoveToPoint(context, curPoint.x, curPoint.y); 

for(int i = 1; i < [points count]; i++) { 
    curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue]; 
    CGContextAddLineToPoint(context, curPoint.x, curPoint.y); 
    CGContextStrokePath(context); 
    CGContextMoveToPoint(context, curPoint.x, curPoint.y); 
} 

이렇게하면 한 줄이됩니다. 나는이 같은 4 픽셀 라인을 강조 x 1 픽셀 라인으로 4 픽셀 라인을 생산하고 싶습니다 :

http://img692.imageshack.us/img692/6196/lineexample.png

답변

0

난 당신이 당신이 원하는 경우 1로 설정 폭 라인 다시 경로를 그릴해야합니다 두렵다 그것이 당신의 4 픽셀 경로 바깥쪽에 있다면, 그에 따라 경로를 조정해야합니다.

편집 : 하나의 다른 옵션이 마음에 듭니다. 패턴을 칠할 수 있습니다. 예를 들어 Apple QuartzDemo를 참조하십시오.

+0

그건 내가 생각한거야.나는 선이 수직 또는 수평으로 간다는 것을 알아낼 수 있지만 임의의 모양으로 어떤 방향으로도 갈 수있는 임의의 선이므로 올바른 위치를 어떻게 계산할 지 확신 할 수 없습니다. – JWood

+0

나는 당신이 실제로하려고하는 것을 더 잘 이해할 필요가있다. 몇 가지 예제 이미지를 게시 할 수 있습니까? –

+0

사실 그것은 사용자가 자유롭게 그려서 모든 모양이 될 수 있습니다. – JWood

-1

스트로크를 패스로 변환 한 다음 해당 패스를 스트로크하는 기본 제공 방법은 없습니다. 즉, 선을 두 번 그리는 방법으로 한 번 선을 그려 볼 수 있습니다. 한 번은 6 픽셀 스트로크 (한면에 4 픽셀 + 1), 다른 색상은 4 픽셀 획으로 다시 표현할 수 있습니다.

유사 항목 : 이 전체 불투명도 강조 색상을 그릴하지 않습니다 있지만

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue]; 
CGContextMoveToPoint(context, curPoint.x, curPoint.y); 

for(int i = 1; i < [points count]; i++) { 
    curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue]; 
    CGContextAddLineToPoint(context, curPoint.x, curPoint.y); 
} 

// Set your 1 pixel highlight color here using CGContextSetRGBStrokeColor or equivalent 
// CGContextSetRGBStrokeColor(...) 
CGContextSetLineWidth(context, 6.0); 
CGContextStrokePath(context); 


// Set your 4 pixel stroke color here using CGContextSetRGBStrokeColor or equivalent 
// CGContextSetRGBStrokeColor(...) 
CGContextSetLineWidth(context, 4.0); 
CGContextStrokePath(context); 

또 다른 아이디어는 스트로크를 그리기 전에 CGContextSetShadowWithColor (문맥, CGSizeZero, 1.0, yourHighlightColorHere)를 통해 그림자를 설정하는 것입니다. (섀도우가 쉐도우 스트로크 그림자인지 기억할 수 없다 - 채움으로 만 사용했다.)

+1

나는 Abhi에 의해 고쳐 졌어 - CGPathCreateCopyByStrokingPath()가 iOS 5 (cool!)의 새로운 API 인 것처럼 보입니다. – iccir

+1

동등한 pre-iOS5-CGContextReplacePathWithStrokedPath - 오랜 시간 동안있었습니다. – Adam

5

iOS 5.0에는 원하는대로하는 새로운 기능 CGPathCreateCopyByStrokingPath()이 추가되었습니다.

먼저 검은 색 경로에 CGPathRef을 작성한 다음 CGPathCreateCopyByStrokingPath()으로 복사본을 만듭니다.

이렇게하면 검은 색으로 채우고 빨간색으로 선을 그어 원하는대로 할 수있는 새로운 경로를 제공합니다.

또한 경로 생성이 약간 느립니다. 화면 그리기를 수행하는 동안 경로를 생성하지 않아야합니다. 모든 경로는 RAM에 저장되어야하며 전에 전에 화면에 그리기를 시작해야합니다. drawRect:은 패스를 그려야 만 생성 할 수 있습니다.

0

내 질문에 대한 답변을 추가하려면 강조 표시 색상에서 몇 픽셀 더 넓은 선을 그린 다음 위에 실제 선을 그려서 수행 할 수 있습니다. 그러면 외곽 효과가 생성됩니다.

1
Abhi 베커이 시사하는 것과 유사

,하지만 당신은이 기능을 사용할 수 있습니다 : 너무 나이의 SDK에 존재하는

CGContextReplacePathWithStrokedPath(CGContextRef c); 

을 - 아이폰 OS 4.1, 맥 OS X 10.6, 예를 들어.
또한 전체 경로를 만든 다음 끝에 스트로크 (또는 스트로크와 동시에 채우기)하는 것이 좋습니다. 즉, 루프 내에 CGContextStrokePath을 가질 필요가 없습니다.

관련 문제