当我在 mkMapView 中更改段时无法更改引脚颜色
Posted
技术标签:
【中文标题】当我在 mkMapView 中更改段时无法更改引脚颜色【英文标题】:Can't be changed pin color when I change segement in mkMapView 【发布时间】:2012-08-31 07:36:48 【问题描述】:我对 mapView 中的注释有一些问题。让我们看一下我的要求。
我想让用户选择会议地点。
有两种选择。
1) 我应该列出附近的数据
或者
2) 他可以将图钉拖放到任何他想要的地方!
为此,我创建了一个细分。 附近数据的第一个索引 和 放置图钉的第二个索引。
对于第一个选项(“附近”),我需要从卖家位置、买家位置以及卖家和买家之间的中点获取附近的数据。所以我调用google api并通过传递纬度和经度三次来获取数据。第一次获取数据时没有问题。我的数组填满了所有数据(包括 3 个响应),并且引脚颜色也会根据要求发生变化。
买家(红色) 卖家(紫色) 中点(绿色)
现在,当我单击放置图钉时,所有数据都会从数组中删除,并且会在地图上放置一个图钉。
到现在为止它工作正常!
但是当您再次单击“附近”时,问题就开始了!毫无疑问,它可以为我提供我想要的数据,但不会保留别针颜色。
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
if ([segmentND selectedSegmentIndex]==0)
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)
[myMapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
if (!pinView)
MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
switch (self.pinColor)
case 0:
customPinView.pinColor = MKPinAnnotationColorPurple;
break;
case 1:
customPinView.pinColor = MKPinAnnotationColorRed;
break;
case 2:
customPinView.pinColor = MKPinAnnotationColorGreen;
break;
default:
break;
customPinView.canShowCallout = YES;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
customPinView.rightCalloutAccessoryView = rightButton;
return customPinView;
else
pinView.annotation = annotation;
return pinView;
else
// Code of dragging dropping pin. It works Fine.s
我附上image 以获得更多想法。
请给我解决方案或任何其他方式来实现它。 记住 Pin 颜色是区分卖方买方和中点的必要条件!
【问题讨论】:
只需检查您的开关条件,即控制进入其中或不使用断点 self.pinColor 有什么价值? 【参考方案1】:您当前方法的问题在于 self.pinColor 不会根据地图需要查看的注释而改变。它可以并且会在任何时候调用 viewForAnnotation 。也许地图已经滚动,一个大头针刚刚回到视野中。也许应用程序被置于后台,只是被用户重新带回视图。您需要分析注释的原因是传递以确定在视图中使用哪种引脚颜色。您使用什么对象进行注释?如果它是 HAnno 并且它有一个名为 pinColor 的属性,你会做这样的事情而不是你的 switch 语句。
HSAnno* currentAnno = (HSAnno *)annotation;
pinView.pinColor = currentAnno.pinColor;
这样,无论需要重绘什么注释,viewForAnnotation 总是会返回正确的彩色图钉。
【讨论】:
我的框架中没有这样的类!这是第三方代码吗? HSAnno 类是我作为示例编写的(当我输入 Hemang Shah 时,答案在文本框上方,我取的是他的首字母而不是你的)。这门课实际上并不存在,由你来写一个。您必须实现 MKAnnotationProtocol 并添加一个属性(可以称为 pinColor 或任何东西)。然后,当调用 viewForAnnotation 时,您将通用注释对象转换为您的类(在检查它不是 userPin 之后),然后根据属性的值设置 pin 的颜色。【参考方案2】:当不存在可重复使用的 pin 时,您在该代码部分中设置 pincolor。
if (!pinView)
....
customPinView.pinColor = MKPinAnnotationColorPurple;
....
当调用viewForAnnotation
并找到可重复使用的引脚时,它们会被使用。那里有错误的颜色别针。
在
中设置您的pincolorelse
pinView.annotation = annotation;
部分,它应该可以正常工作。
【讨论】:
【参考方案3】:认为这里弄错了
else
pinView.annotation = annotation;
return pinView;
改正为
else
pinView.annotation = annotation;
return pinView;
【讨论】:
【参考方案4】:这是我对您的代码和MKMapView
委托的一点修改。以前,您更改了 if
内部的 pin
颜色,使其在第一次加载 MKMapView
时只调用一次。
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)
[mapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
if (!pinView)
pinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
else
pinView.annotation = annotation;
switch (self.pinColor)
case 0:
pinView.pinColor = MKPinAnnotationColorPurple;
break;
case 1:
pinView.pinColor = MKPinAnnotationColorRed;
break;
case 2:
pinView.pinColor = MKPinAnnotationColorGreen;
break;
default:
break;
pinView.canShowCallout = YES;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
return pinView;
return pinView;
附:我已删除您的第一个 UISegment
条件以在我身边检查,请在实施时按原样添加。
【讨论】:
有效!但是当我放大和缩小我的地图时,同样的问题! 放大和缩小时发生了什么? 现在我得到了随机一种颜色(紫色、红色或绿色)的所有图钉以上是关于当我在 mkMapView 中更改段时无法更改引脚颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何在iPhone SDK中的MKMapView中单击注释引脚切换到另一个视图?
如何更改 Apple Map (MKMapView) 背景颜色?