2009-07-27 4 views
9

Пользовательский AnnotationView обновляется с новыми координатами. Но проблема в том, что он визуально обновляется только после некоторых манипуляций с MKMapView, например. масштабирование или перемещение. Что нужно сделать, чтобы вручную обновить визуальную позицию на карте?Обновление MKMapView после перемещений буфера

PS. Я попытался изменить регион на регион текущей карты. Но он меняет масштаб. Странно.

[mapView setRegion:[mapView region] animated:YES]; 
+0

Просьба посмотреть мой ответ по следующей ссылке: http://stackoverflow.com/a/24564868/665961 –

ответ

19

Я немного шокирован после нескольких часов исследований. Ответ просто:

[mapView setCenterCoordinate:mapView.region.center animated:NO]; 

Не спрашивайте меня, почему, но он обновляет карту, и это то, что мне нужно.

+1

UPD: это не помогает с SDK 3.1. Все еще в исследовании. – slatvick

+1

Не работает в 3.1.2. – bradheintz

+0

Это просто исправлено моя ошибка! Благодаря!!!!! –

-7

Вот интерфейс MapAnnotation:

// CSMapAnnotation.h 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h>  

// types of annotations for which we will provide annotation views. 
typedef enum { 
    MapAnnotationTypeStart = 0, 
    MapAnnotationTypeEnd = 1, 
    MapAnnotationTypeImage = 2 
} MapAnnotationType; 

@interface MapAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D _coordinate; 
    MapAnnotationType  _annotationType; 
    NSString*    _title; 
    NSString*    _subtitle; 
    NSString*    _userData; 
    NSString*    speed; 
    NSString*    identifier; 
} 

@property (nonatomic, retain) NSString *speed; 
@property (nonatomic, retain) NSString *identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speed 
    identifier: (NSString *) identifier;  
-(id) setWithCoordinate: (CLLocationCoordinate2D) coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speed 
    identifier: (NSString*) identifier;  
@property MapAnnotationType annotationType; 
@property (nonatomic, retain) NSString* userData;  
@end  

А вот реализация:

// CSMapAnnotation.m 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import "MapAnnotation.h"  

@implementation MapAnnotation 

@synthesize coordinate  = _coordinate; 
@synthesize annotationType = _annotationType; 
@synthesize userData  = _userData; 
@synthesize speed; 
@synthesize identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*)title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speedz 
    identifier: (NSString *) identifierz 
{ 
    self = [super init]; 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz; 
    return self; 
}  
-(id) setWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speedz 
    identifier: (NSString*) identifierz 
{ 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz;  
    return self; 
}  
-(NSString*) title 
{ 
    return _title; 
}  
-(NSString*) subtitle 
{ 
    return _subtitle; 
}  
-(void) dealloc 
{ 
    [_title release]; 
    [_userData release]; 
    [super dealloc]; 
}  
@end 
12

MKMapView отмечает координату свойство аннотации через KVO. Вам просто нужно соблюдать надлежащий протокол KVO и отправить аннотацию willChangeValueForKey: и didChangeValueForKey: с ключом @"coordinate" до и после обновления координат.

Аналогичным образом title и subtitle также наблюдаются по MKMapView. так что если вы обновляете те, и хотите получить значение в условном обозначении для автоматического изменения без каких-либо усилий с вашей стороны, просто делать то же самое: позвонить willChangeValueForKey: и didChangeValueForKey:

+0

Это действительно приятно знать, спасибо. – samvermette

+0

Пока работает 'setCenterCoordinate: анимированный:', способ KVO также работает и определенно более уместен и позволяет 'MKMapView' лучше координировать обновления из нескольких наблюдений. –

-2

Там нет причин вы не можете удалить, а затем повторно добавить аннотацию , Это, вероятно, гораздо более результативно, чем перемещение всей карты, даже если это поддельный ход.

+0

Кто-то хочет объяснить, почему это было приостановлено? Это, по крайней мере, альтернатива, и я бы сказал, что это более результативно. –

+0

Я уверен, что большинство людей, которые нашли эту тему, уже пробовали это; Я знаю, что знаю. Это вызывает странное поведение. –

2

Ответ здесь не для обновления MapView или аннотации!

Свойство координат MKAnnotation имеет KVO на нем. Если вы просто добавите указатель id, объекта, который вы хотите на карте, в mapview и обновите свойство координат с новым местоположением, MKMapView сделает все остальное за вас.

Как можно ближе к бесплатному обеду!

9

если вы добавите свои аннотации из нити, они не будут работать. я имел такую ​​же проблему и просто обертывание мою функции, которая была добавление аннотаций со следующим работал

[self performSelectorOnMainThread:@selector(addCameraIconOnMain:) obj waitUntilDone:true]; 

-(void) addCameraIconOnMain:(myobjecttype*)obj 
{ 
    // this isnt the entire function, customize for your own purpose..... 
    [mapView addAnnotation:annotation]; 
} 
0

Я решил эту ошибку с асинхронным вызовом, задержкой по меньшей мере 0,5.

.: [self performSelector:@selector(redrawPins) withObject:nil afterDelay:0.5]; например

Где "redrawPins" это функция, которая добавляет и удаляет булавки.

Смежные вопросы