在xcode中将不同的图像添加到不同的注释视图
Posted
技术标签:
【中文标题】在xcode中将不同的图像添加到不同的注释视图【英文标题】:Adding different images to different annotation views in xcode 【发布时间】:2011-05-27 01:40:14 【问题描述】:我正在尝试将不同的图像添加到不同的注释视图中,换句话说,我想要一个独特的图片来对应每个独特的图钉。这是我正在尝试的:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
NSLog(@"welcome into the map view annotation");
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
pinView.pinColor=MKPinAnnotationColorPurple;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
if (CLLocationCoordinate2D == theCoordinate1)
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jeff.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
[profileIconView release];
else if(CLLocationCoordinate2D = theCoordinate2)
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Pierce.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
[profileIconView release];
我写的那行出错了
if (CLLocationCoordinate2D == theCoordinate1)
我不太确定出了什么问题,我也想不出另一种方法来识别单个注释。非常感谢任何帮助!
【问题讨论】:
杰夫,欢迎来到 SO!尽量避免在代码粘贴中使用制表符 - 尝试使用空格来代替 - 让您的代码在您的问题中正确格式化。那么帮助你就容易多了! 【参考方案1】:该行给出了一个错误,因为CLLocationCoordinate2D
是一种结构类型,而theCoordinate1
是,我假设,一个类型为CLLocationCoordinate2D
的变量。两者无法比较。
您要做的是将请求视图的当前注释的坐标与theCoordinate1
中的坐标进行比较。为此,如果必须,您需要这样的东西:
if ((annotation.coordinate.latitude == theCoordinate1.latitude)
&& (annotation.coordinate.longitude == theCoordinate1.longitude))
但是,我不建议以这种方式比较浮点数,即使它有时“有效”。如果必须比较坐标,请使用 CLLocation 的distanceFromLocation:
方法,看看两者之间的距离是否低于某个阈值,例如 10.0 米。
检查注解是否是您要查找的注解的另一种方法是保留对注解本身的引用(您传递给addAnnotation:
方法的那个),然后您可以执行if (annotation == theAnnotation1)
。
如果您不想保留对注释的引用,您还可以检查注释的标题是否是您要查找的标题 (if ([annotation.title isEqualToString:@"Jeff"])
)。
最好的方法是将自定义属性(理想情况下是 int)添加到自定义注释类并在 viewForAnnotation 中检查。
其他一些不相关的事情:
不要执行 addTarget,而是在地图视图自己的calloutAccessoryControlTapped
委托方法中处理按钮按下,该方法将提供对注释的引用(例如,参见 How to find which annotation send showDetails?)。
您对“出队”有评论,但您没有这样做。建议在 viewForAnnotation 中使用 dequeueReusableAnnotationViewWithIdentifier
来重用视图(例如,参见 EXC_BAD_ACCESS with MKPinAnnotationView)。
【讨论】:
以上是关于在xcode中将不同的图像添加到不同的注释视图的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 中将图像尺寸调整为不同的 iPhone 屏幕尺寸