カスタム AnnotationView が新しい座標で更新されます。しかし、問題は、ズームや移動など、MKMapView を使用したいくつかの操作の後にのみ視覚的に更新されることです。マップ上の視覚的な位置を手動で更新するにはどうすればよいですか?
PS。地域を現在の地図の地域に変更しようとしました。しかし、それはズームを変更します。それは奇妙です。
[mapView setRegion:[mapView region] animated:YES];
カスタム AnnotationView が新しい座標で更新されます。しかし、問題は、ズームや移動など、MKMapView を使用したいくつかの操作の後にのみ視覚的に更新されることです。マップ上の視覚的な位置を手動で更新するにはどうすればよいですか?
PS。地域を現在の地図の地域に変更しようとしました。しかし、それはズームを変更します。それは奇妙です。
[mapView setRegion:[mapView region] animated:YES];
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 や Annotation を更新しないことです!
MKAnnotation の座標プロパティには KVO があります。マップ上に表示したいオブジェクトの id ポインターを mapview に追加し、座標プロパティを新しい場所で更新するだけで、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