рисование угла обзора курса с кварцем - PullRequest
2 голосов
/ 04 июля 2011

Я просто хотел нарисовать угол обзора в MKMapView, например, в приложении «Карты». Конечно, я могу сделать это с помощью Photoshop или любой необходимой программы. Но мне не нужно учитывать дисплеи сетчатки или различия на экране. Можно ли нарисовать эту форму с помощью кварца или любой другой встроенной библиотеки и как?

enter image description here

спасибо заранее.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Вы можете;) Для этого вам нужно реализовать этот метод:

- (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 вызовет перерисовку.

Убедитесь, что ваш пользовательский вид имеет ненулевой прямоугольниккадр, и НЕ устанавливайте на него изображение.

0 голосов
/ 04 июля 2011

Раньше MKMapView не использовался, но вы могли бы создать его подкласс и в своем методе drawRect: сначала нарисовать суперкласс, а затем использовать стандартные методы рисования CG, чтобы нарисовать угол вашего курса поверх него.

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

    // Your drawing goes here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...