用石英绘制标题角度视图

时间:2011-07-04 10:48:10

标签: iphone cocoa-touch ios4 mapkit

我只想在地图应用程序上绘制MKMapView的标题角度视图,当然我可以用photoshop或任何必要的程序来做。但我不需要考虑视网膜显示或屏幕差异。是否可以用石英或任何相关的内置库绘制这种形状,以及如何?

enter image description here

提前感谢。

2 个答案:

答案 0 :(得分:1)

你可以;) 为此,您需要实现此方法:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

在这一步中,您必须仅为注释的用户位置情况创建MKAnnotationView子类的实例,如:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        if (userView == nil) {
            userView=[[[UserLocationView alloc] 
                       initWithAnnotation:annotation reuseIdentifier:@"user"]
                      autorelease];
        }

        [self addObserver:userView forKeyPath:@"userHeading" options:NSKeyValueObservingOptionNew context:NULL] ; 

        return userView ; 
    }

    return nil;
}

请注意KVO语句,让您的自定义MKAnnotationView值已更改 在您的MKAnnotationView子类中,您需要覆盖drawRect;像那样的例子

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    NSAssert(context !=nil, @"Context was nil") ;

    CGContextSetRGBStrokeColor (context,1.0f,0.0f,0.0f,1.0f) ;

    CGContextSetLineWidth(context, 2.0f);

    CGContextMoveToPoint(context, 0, 15);
    CGContextAddLineToPoint(context, 30, 15);

    CGContextMoveToPoint(context, 15,0);
    CGContextAddLineToPoint(context, 15, 30);

    CGContextStrokePath(context);

    CGContextSetLineWidth(context, 4.0f);

    CGContextAddArc (context,15,15,13,0,6.28,0);

    CGContextStrokePath(context);

    hdg = radians([self heading]);

    dx = self.frame.size.width / 2 ;
    dy = self.frame.size.height/ 2 ;

    if (hdg < M_PI) {
        y = (cos(hdg) * dy ) - dy ;
        x = (sin(hdg) * dx ) + dx ;
    } else {
        y = (cos(hdg) * dy ) + dy ;
        x = (sin(hdg) * dx ) + dx ;
    }


    // NSLog(@"Heading:%3f Hdg:%3f X:%3f Y:%3f", heading, hdg, x, y) ;

    CGContextSetRGBStrokeColor (context,1.0f,0.0f,1.0f,1.0f) ;

    CGContextSetLineWidth(context, 2.0f);
    CGContextMoveToPoint(context, dx,dy);
    CGContextAddLineToPoint(context, x, y);


    CGContextStrokePath(context);
}

这绘制了一个带有紫色线条的红色十字线,显示了标题(在我的样本中,课程被窃听,因为我的三角学很弱;)但是它画了:)

您当然需要处理KVO通知,如:

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    [self setHeading: [[change objectForKey:NSKeyValueChangeNewKey]doubleValue]] ;
    [self setNeedsDisplay] ; 
    NSLog(@"Heading is %f", [self heading]);
}

-setNeedsDisplay将触发重绘。

确保您的自定义视图具有非零的矩形框,并且不要将图像设置为它。

答案 1 :(得分:0)

以前没有使用过MKMapView,但你可以将它子类化,并在drawRect:方法中首先绘制超类,然后使用标准CG绘图方法在其上绘制标题角。

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    // Your drawing goes here
}