Обновление MKMapView после перемещения булавки
-
19-09-2019 - |
Вопрос
Пользовательский AnnotationView обновляется новыми координатами.Но проблема в том, что визуально он обновляется только после некоторых манипуляций с MKMapView, например.масштабирование или перемещение.Что мне следует сделать, чтобы вручную обновить визуальное положение на карте?
ПС.Я попытался изменить регион на регион текущей карты.Но это меняет масштаб.Странно.
[mapView setRegion:[mapView region] animated:YES];
Решение
Я немного шокирован после нескольких часов исследований.Ответ просто:
[mapView setCenterCoordinate:mapView.region.center animated:NO];
Не спрашивайте меня, почему, но он обновляет карту, и это то, что мне нужно.
Другие советы
MKMapView
наблюдает за свойством координат аннотаций через KVO
.Просто нужно соблюдать правильность KVO
протокол и отправьте аннотацию willChangeValueForKey:
и didChangeValueForKey:
с ключевой дорожкой @"coordinate"
до и после обновления координат.
Так же title
и subtitle
также наблюдаются MKMapView
.поэтому, если вы обновите их и хотите, чтобы значение в выноске менялось автоматически без каких-либо усилий с вашей стороны, просто сделайте то же самое:вызов 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