MKMapView 自动移动注释 - 为它们设置动画?
Posted
技术标签:
【中文标题】MKMapView 自动移动注释 - 为它们设置动画?【英文标题】:MKMapView moving Annotations Automatically - animate them? 【发布时间】:2011-05-06 00:19:01 【问题描述】:我有一组可以很快更新的注释数据。目前我删除了所有注释,然后将它们重新绘制到地图上。
NSArray *existingpoints = [mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]];
[mapView removeAnnotations:existingpoints];
我计算了它们在自定义对象中的位置,因此希望能够调用它并“移动”注释,而无需删除并将其重新添加回地图。我所做的示例调用有效并且我想几乎“投票”如下。
- (CLLocationCoordinate2D) coordinate
CLLocationCoordinate2D coord;
coord.latitude = [lat doubleValue];
coord.longitude = [lon doubleValue];
double differencetime = exampleTime;
double speedmoving;
double distanceTravelled = speedmoving * differencetime;
CLLocationDistance movedDistance = distanceTravelled;
double radiansHeaded = DEG2RAD([self.heading doubleValue]);
CLLocation *newLocation = [passedLocation newLoc:movedDistance along:radiansHeaded];
coord = newLocation.coordinate;
return coord;
按要求,Object的.h文件,我没有SetCoordinate方法..
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface TestObject : NSObject <MKAnnotation>
NSString *adshex;
NSString *lat;
NSString *lon;
NSString *title;
NSString *subtitle;
CLLocationCoordinate2D coordinate;
@property(nonatomic,retain)NSString *adshex;
@property(nonatomic,retain)NSString *lat;
@property(nonatomic,retain)NSString *lon;
@property(nonatomic,retain)NSString *title;
@property(nonatomic,retain)NSString *subtitle;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
- (CLLocationCoordinate2D) coordinate;
@end
【问题讨论】:
您的注释对象中是否有 setCoordinate 方法或只有坐标方法?显示注释对象的 .h 文件。 不,我没有,将 .h 添加到编辑中 【参考方案1】:如果您使用 setCoordinate 方法(或等效方法)更新注解的坐标,地图视图将自动更新注解在视图上的位置。文档中的This page 说明如下:
重要提示:当您实施 在你的类中协调属性,它 建议您合成其 创建。如果您选择实施 此属性的方法 自己,或者如果您手动修改 该属性的基础变量 在你班的其他部分之后 注解已添加到地图中, 确保发出键值 观察 (KVO) 通知时,您 做。 Map Kit 使用 KVO 通知 检测坐标的变化, 您的标题和副标题属性 注释并进行任何需要 地图显示的变化。如果你这样做 不发送 KVO 通知, 您的注释的位置可能不会 在地图上正确更新。
只有在被告知(通过 KVO)坐标已更改时,地图视图才会知道重新读取注释的坐标属性。一种方法是实现一个 setCoordinate 方法,并在有更新注解位置的代码的任何地方调用它。
在您的代码中,您正在重新计算只读坐标属性本身的坐标。您可以做的是将其添加到注释 .m 文件(和 .h)中:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
//do nothing
在你更新位置的地方,调用注解的setCoordinate方法:
[someAnnotation setCoordinate:someAnnotation.coordinate];
您可以在当前删除/重新添加注释的地方执行此操作。
上面的调用看起来很有趣,因为您在坐标获取器方法中重新计算了坐标。虽然它应该可以作为快速修复/测试,但我不建议经常使用它。
相反,您可以重新计算注释在外部的位置(您当前删除/重新添加注释的位置)并将新坐标传递给 setCoordinate。您的注释对象可以将其新位置存储在您当前拥有的 lat/lng ivars 中(将它们设置在 setCoordinate 中并仅使用那些来构造 CLLocationCoordinate2D 以从 getter 返回)或(更好)使用坐标 ivar 本身(将其设置为setCoordinate 并在 getter 中返回)。
【讨论】:
“重要”说明的链接已更改:developer.apple.com/library/ios/documentation/userexperience/… 不幸的是,它根本没有动画过渡。有人知道动画移动注释的任何方法吗? [UIView animateWithDuration:2.2 动画:^ [tempPlacemark setCoordinate:newAnnoView.coordinate]; 完成:^(BOOL 完成) ];以上是关于MKMapView 自动移动注释 - 为它们设置动画?的主要内容,如果未能解决你的问题,请参考以下文章