Обновление MKMapView после перемещения пина

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

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

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

person slatvick    schedule 27.07.2009    source источник
comment
Пожалуйста, посмотрите мой ответ по следующей ссылке: stackoverflow.com/a/24564868/665961   -  person Haris ur Rehman    schedule 04.07.2014


Ответы (7)


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

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

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

person slatvick    schedule 30.07.2009
comment
UPD: не помогает с SDK 3.1. Все еще в исследованиях. - person slatvick; 08.10.2009

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

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

person freespace    schedule 30.07.2010
comment
Хотя setCenterCoordinate:animated: работает, здесь также работает метод KVO, который определенно более подходит и позволяет MKMapView лучше координировать обновления из нескольких наблюдений. - person Scott Corscadden; 07.03.2014

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

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

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

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

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

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

person PLG    schedule 07.09.2010

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

e.g.: [self performSelector:@selector(redrawPins) withObject:nil afterDelay:0.5];

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

person diegodsp    schedule 01.08.2011

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

person M. Ryan    schedule 30.07.2010
comment
Кто-то хочет объяснить, почему это было отклонено? Это, по крайней мере, альтернатива, и я бы сказал, что она более производительна. - person M. Ryan; 10.08.2010
comment
Я уверен, что большинство людей, которые нашли эту ветку, уже пробовали это; Я знаю, что сделал. Это вызывает странное поведение. - person Oh Danny Boy; 26.08.2010

Вот интерфейс 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
person geekyaleks    schedule 10.10.2009