2012-05-10 3 views
4

MKOverlayPathView에서 상속 한지도 사용자 정의보기가 있습니다. 원, 선 및 텍스트를 표시하려면이 사용자 정의보기가 필요합니다.경로 그림을 사용하여 텍스트를 추가하는 방법이 있습니까

이미 CGPathAddArc 및 CGPathAddLineToPoint 기능을 사용하여 원과 선을 그릴 수있었습니다.

그러나 텍스트를 추가해야합니다.

나는

[text drawAtPoint:centerPoint withFont:font]; 

를 사용하여 텍스트를 추가하려고하지만 잘못된 컨텍스트 오류가 발생했습니다.

어떤 아이디어가 있습니까?

답변

7

MKOverlayPathView을 사용하면 텍스트를 추가하는 가장 쉬운 방법은 drawMapRect:zoomScale:inContext:을 덮어 쓰고 거기에 경로와 텍스트 그리기를 넣는 것입니다 (아무 것도하지 않거나 createPath을 구현하지 않음).

어쨌든 drawMapRect을 사용하려는 경우 MKOverlayPathView 대신 일반 MKOverlayView을 서브 클래 싱하는 것으로 전환하는 것이 좋습니다. MKOverlayView 함께

상기 drawMapRect:zoomScale:inContext: 메소드를 재정의하고 CGContextAddArc (또는 CGContextAddEllipseInRect 또는 CGPathAddArc)를 사용하여 원을 그린다.

이 방법에서 drawAtPoint을 사용하여 텍스트를 그릴 수 있습니다.이 텍스트는 필요한 context이어야합니다. 중심 좌표 또는 관련 MKOverlay 변화의 반경 (또는 무엇이든) 할 때

다른 대답 코멘트와 관련
-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{ 
    //calculate CG values from circle coordinate and radius... 
    CLLocationCoordinate2D center = circle_overlay_center_coordinate_here; 

    CGPoint centerPoint = 
     [self pointForMapPoint:MKMapPointForCoordinate(center)]; 

    CGFloat radius = MKMapPointsPerMeterAtLatitude(center.latitude) * 
         circle_overlay_radius_here; 

    CGFloat roadWidth = MKRoadWidthAtZoomScale(zoomScale); 

    //draw the circle... 
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] colorWithAlphaComponent:0.2].CGColor); 
    CGContextSetLineWidth(context, roadWidth); 
    CGContextAddArc(context, centerPoint.x, centerPoint.y, radius, 0, 2 * M_PI, true); 
    CGContextDrawPath(context, kCGPathFillStroke); 

    //draw the text... 
    NSString *text = @"Hello"; 
    UIGraphicsPushContext(context); 
    [[UIColor redColor] set]; 
    [text drawAtPoint:centerPoint 
      withFont:[UIFont systemFontOfSize:(5.0 * roadWidth)]]; 
    UIGraphicsPopContext(); 
} 

...

, 당신은 MKOverlayView을 할 수 있습니다 : 예를 들어

오버레이를 제거하고 다시 추가하는 대신 setNeedsDisplayInMapRect:을 호출하여 '이동'합니다. MKOverlayPathView을 사용하는 경우 invalidatePath을 대신 호출 할 수 있습니다.

setNeedsDisplayInMapRect:을 호출 할 때지도 rect 매개 변수에 대해 boundingMapRect 오버레이를 전달할 수 있습니다. WWDC 2010에서 LocationReminders 샘플 응용 프로그램에서

는 오버레이 뷰는 관련 MKOverlay에 대한 변경 사항을 관찰 KVO를 사용하고 원의 특성에 변화를 감지 할 때마다 자체가 이동하지만 당신은 다른 방법으로 변경 사항을 모니터링하고 setNeedsDisplayInMapRect:를 호출 할 수 있습니다 오버레이보기 외부에서 명시 적으로.

(내가 MKOverlayPathView를 사용하여 언급했고, 그이 LocationReminders 응용 프로그램이 움직이는 원 오버레이 뷰를 구현합니다.하지만 당신은 또한 원을 그리는 MKOverlayView을 사용하는 방법을 언급 한 방법입니다 다른 답변의 댓글에. 미안 해요 그.)

+0

감사 안나 ... 난 원을 그리는 MKOverlayPathView을 사용했는데 그것을 잘 작동합니다 :

그래서 나를 위해 그것을 이렇게 끝났다. 보기 이동을 애니메이션화해야합니다. 현재지도의 기본 사용자 아이콘이 위치가 변경되면 애니메이션 방식으로 움직이기 때문에 따라서 내 서클 뷰도 애니메이션이어야합니다. [UIView beginAnimations 및 [UIView commitAnimations]; 하지만이 코드를 어디에 넣어야할지 모르겠습니다. MKOverlayPathView에서 invalidatePath 이전과 이후에 예를 들어 넣어야합니까? – user836026

+1

일반적으로 예, beginAnimations/commitAnimations (또는 블록 기반 animateWithDuration)을 사용하는보기를 애니메이션으로 만들지 만 MKOverlayViews에서는 작동하지 않습니다 (적어도 어떻게 알지는 못합니다). 그러나 MKOverlay 대신 MKAnnotation (원형 이미지 또는 원 그리기)을 사용해도 상관 없으면 특수 효과 뷰의 애니메이션을 부드럽게 처리 할 수 ​​있습니다. 예를 들어 http://stackoverflow.com/questions/8564013/animate-removal-of-annotations를 참조하십시오. 주석이있는 문제는 이미지/그림이 일정한 크기 (예 : 사용자 위치 파란색 점)를 유지한다는 것입니다. – Anna

1

UIGraphicsPushContext와 함께 문맥을 밀게되면 나에게 문제가 발생했다. 메소드 drawMapRect:zoomScale:inContext:이 다른 스레드에서 동시에 호출된다는 점을 상기시켜주십시오. UIGraphicsPushContext이 호출 된 코드 부분을 UIGraphicsPopContext 호출과 동기화해야했습니다.[UIFont systemFontOfSize:(5.0 * roadWidth)] 한 아이 패드 iPad2를 들면 iPhone3가 1 인 고려 [UIScreen mainScreen].scale 고려한다 아이폰 4에서와 같이에 대한 폰트 크기를 계산할 때

또한 - 5 iPad3 2이다. 그렇지 않으면 텍스트 크기가 iPad2에서 iPad3로 달라집니다. [UIFont boldSystemFontOfSize:(6.0f * [UIScreen mainScreen].scale * roadWidth)]