0

지도 앱을 사용하여지도 주석을 그려야합니다. MapKit의 MKAnnotationView와 매우 유사하지만 mapkit은 없습니다.Core Graphics - iPhone으로 경로를 그리는 데 문제가 있습니다.

내가 알아낼 수없는 뷰 개요의 경로 순서에 문제가 있습니다. 결과

이미지 :

http://img504.imageshack.us/img504/5458/screenshot20091010at703.png

코드 :

CGFloat minx = CGRectGetMinX(currentBounds); 
CGFloat midx = CGRectGetMidX(currentBounds); 
CGFloat maxx = CGRectGetMaxX(currentBounds); 
CGFloat miny = CGRectGetMinY(currentBounds)+10.0f; 
CGFloat midy = CGRectGetMidY(currentBounds)+10.0f; 
CGFloat maxy = CGRectGetMaxY(currentBounds)+10.0f; 

CGContextBeginPath(currentContext); 
CGContextMoveToPoint(currentContext, minx, miny+radius); //before top left arc 
CGContextAddArcToPoint(currentContext, minx, miny, midx, miny, radius); //top left 

CGPoint points1[] = { 
CGPointMake(midx-10.0f, miny), 
CGPointMake(midx, 0.0f), //tip of arrow 
CGPointMake(midx+10.0f, miny), 
}; 
CGContextAddLines(currentContext, points1, 3); 
CGContextAddArcToPoint(currentContext, maxx, miny, maxx, midy, radius); //top right 
CGContextAddArcToPoint(currentContext, maxx, maxy, midx, maxy, radius); //bottom right 
CGContextAddArcToPoint(currentContext, minx, maxy, minx, midy, radius); //bottom left 
CGContextClosePath(currentContext); 

CGContextClosePath(currentContext); 
CGContextDrawPath(currentContext, kCGPathFillStroke); 
//CGContextDrawPath(currentContext, kCGPathEOFillStroke); 

답변

0

따라서 CGContextPathBegin의 유무에 관계없이 어떤 값을 입력했는지에 상관없이 CGContextMoveToPoint가 작동하지 않았습니다. 포인터 화살표의 구석에있는 선으로 경로를 시작하면 시작점을 지정할 수있었습니다. Peter가 이해하도록 도와 주신 Peter에게 감사 드리며 경로를 단순화하는 방법에 대해 알려드립니다.

+1

CGContextAddToLines가 암시 적으로 'moveto'를 수행하여 명시 적으로 취소 된 것처럼 작동하지 않는 것은 아닙니다. 내 답변에 대한 나의 최신 코멘트를 참조하십시오. –

4

은 포스트 스크립트 (및 AppKit의 그리기 및 코어 그래픽 등 파생 상품)에, 당신은 일반적으로 시계 반대 방향으로 경로를 먼저 그릴 특히 충전 할 때. 여기에 표시된 것과 같은 시계 방향 경로는 외부로 채우려는 경우 그리는 것입니다.

두 번째로,이 컨텍스트는 왼쪽 아래 (양수 y가 아래)가 아닌 왼쪽 (양수 y가)으로 시작한다고 가정합니다.

첫 번째 호에서 벗어나면 현재 점은 포인터의 아래쪽에서 데드 센터입니다. arct 명령 (CGContextAddArcToPoint)의 두 번째 점을 포인터의 첫 번째 기준점으로 설정하는 것이 더 합리적이지 않습니까? 더 정확한 것 외에도 두 점을 CGContextAddLines으로 전달하면됩니다.

경로를 두 번 닫으시겠습니까? 나는 그것이 아무 것도 아프지 않다고 생각하지만, 그것은 불필요합니다.

포인터의 오른쪽 기점에서 그리기를 시작한 다음 다음 두 점 (선단 및 왼쪽 기점,이 순서대로)에 선을 그린 다음 네 개의 호를 모두 (시계 반대 방향으로) 승계 한 다음 closepath (한 번). 약간 더 간단하고 정확해야합니다.

+0

CGContextMoveToPoint (currentContext, midx + 10.0f, miny); \t CGPoint 지점 [] = { \t \t CGPointMake (midx, 0.0f로) // 포인트 \t \t CGPointMake (MINY midx-10.0f), \t}; \t CGContextAddLines (currentContext, points, 2); \t \t CGContextAddArcToPoint (currentContext, minx, miny, minx, midy, radius); // TL \t CGContextAddArcToPoint (currentContext, minx, maxy, midx, maxy, radius); // BL \t CGContextAddArcToPoint (currentContext, maxx, maxy, maxx, midy, radius); // BR \t CGContextAddArcToPoint (currentContext, maxx, miny, midx, miny, radius); // TR \t * CLOSE 경로, DRAW * http://img36.imageshack.us/img36/92/screenshot20091010at816.png – Mobs

+0

베드로는, 팁 주셔서 감사합니다 .. 변명 코멘트는 것을 어떻게 간단한 - 캐릭터가 한도. 이제 출발점이 작동하지 않는 것 같습니다. – Mobs

+0

그 코드는 의도 한대로 작동해야합니다.나는 closetath가 moveto가 아닌 최초의 lineto로 돌아가는 것에 대한 버그를 제기하는 것이 좋습니다. https://bugreport.apple.com/ –

관련 문제