Обновление MKMapView после перемещения штифтов
Пользовательский AnnotationView обновляется новыми координатами. Но проблема в том, что он визуально обновляется только после некоторых манипуляций с MKMapView, например, масштабирования или перемещения. Что я должен сделать, чтобы вручную обновить визуальное положение на карте?
PS. Я пытался изменить регион на регион текущей карты. Но это меняет масштаб. Это странно.
[mapView setRegion:[mapView region] animated:YES];
7 ответов
Я немного шокирован после нескольких часов исследований. Ответ просто:
[mapView setCenterCoordinate:mapView.region.center animated:NO];
Не спрашивайте меня, почему, но он обновляет вид карты, и это то, что мне было нужно.
MKMapView
наблюдает свойство координат аннотаций через KVO
, Вам просто нужно соблюдать надлежащее KVO
протокол и отправить аннотацию willChangeValueForKey:
а также didChangeValueForKey:
с ключом @"coordinate"
до и после обновления координат.
также title
а также subtitle
также соблюдаются MKMapView
, поэтому, если вы обновите их и хотите, чтобы значение в выноске изменялось автоматически без каких-либо усилий с вашей стороны, просто сделайте то же самое: call willChangeValueForKey:
а также didChangeValueForKey:
Если вы добавляете свои аннотации из потока, это не сработает. у меня была та же проблема, и я просто обернул свою функцию, которая добавляла аннотации со следующим
[self performSelectorOnMainThread:@selector(addCameraIconOnMain:) obj waitUntilDone:true];
-(void) addCameraIconOnMain:(myobjecttype*)obj
{
// this isnt the entire function, customize for your own purpose.....
[mapView addAnnotation:annotation];
}
Ответ здесь НЕ для обновления MapView или аннотации!
свойство координат MKAnnotation имеет KVO на нем. Если вы просто добавите указатель идентификатора объекта, который вы хотите видеть на карте, в представление карты и обновите свойство координат, указав новое местоположение, MKMapView сделает все остальное за вас.
Как можно ближе к бесплатному обеду!
Я решил эту ошибку с помощью асинхронного вызова, с задержкой не менее 0,5.
например: [self performSelector:@selector(redrawPins) withObject:nil afterDelay:0.5];
Где "redrawPins" - это функция, которая добавляет и удаляет булавки.
Нет причин, по которым вы не можете удалить, а затем повторно добавить аннотацию. Это, вероятно, намного эффективнее, чем перемещение всей карты, даже если это ложное движение.
Вот интерфейс для 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