- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
目标是根据存储在结构数组中的某些值自定义引脚颜色。
根据此处的一些帮助,我实现了以下 viewForAnnotation 委托(delegate)方法,并且根据我的结构数据数组的大小在循环中迭代调用此委托(delegate)方法效果很好。所以如果我想将所有引脚设置为一种颜色,例如紫色(这是下面代码中的注释行),它就可以工作。
问题是当我放入一个开关以根据数组中的值设置颜色时,它会通过此代码但不考虑任何大小写值以将其设置为替代颜色并且一切都变为红色pin(似乎是默认值)。我已经打印出状态并进行调试以了解它正在进入开关并相应地设置 pinColor,但它们似乎没有粘住。
func mapView(aMapView: MKMapView!,
viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
let theindex = mystructindex // grab the index from a global to be used below
if annotation is MKUserLocation {
//return nil so map view draws "blue dot" for standard user location
return nil
}
let reuseId = "pin"
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if pinView == nil {
//println("Pinview was nil")
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.animatesDrop = true
// Preventive if to keep this from being called beyond my arrays index value as the delegate getting called beyond the for loop for some unknown reason
if (theindex < MySupplierData.count) {
// Set the pin color based on the status value in MySupplierData structure array
switch MySupplierData[mystructindex].status {
case 0,1:
println("Case 0 or 1 - setting to Red")
pinView!.pinColor = .Red // Needs help, show red pin
case 2:
println("Case 2 - Setting to Green")
pinView!.pinColor = .Green // Looking Good
case 3:
println("Case 3 - Setting to Purple")
pinView!.pinColor = .Purple // Could use a follow-up
default:
println("Case default - Should Never Happen")
break;
} // end switch
} // end if
// pinView!.pinColor = .Purple // This works fine without the switch and respects any color I set it to.
}
else {
pinView!.annotation = annotation
}
return pinView
}
在 ViewController 的 for 循环中,我按如下方式调用它,但我不对返回做任何事情。
// previous to this I setup some Titles and Subtitle which work fine
self.theMapView.addAnnotation(myAnnotation)
// Call to my mapview
mapView(theMapView, viewForAnnotation: myAnnotation)
我没有对返回的 Pinview 做任何事情——我认为我不需要这样做,但是此时使用开关代码时所有的引脚都被绘制成红色。从根本上说,我一定在这里遗漏了一些东西。
7-8-14 根据 Anna 的大力帮助/辅导,更新以解决修订后代码的问题。 TKS!
它几乎可以工作, map 内的所有图钉都有正确的颜色,但 map 外的立即显示有时是错误的。在这里发布所有涉及的代码,因为它可能会帮助其他人因为这似乎是关于如何在 map 中进行自定义工作的一个非常常见的问题。
建议在自定义注释中保存其他变量的自定义类 - 在本例中,状态值来 self 的数据结构 MySupplierData。
class CustomMapPinAnnotation : NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String
var subtitle: String
var status: Int
init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String, status: Int) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
self.status = status
}
}
修改后的 mapView - 现在使用传递给它的新 CustomMapPinAnnotation:
func mapView(aMapView: MKMapView!,
viewForAnnotation annotation: CustomMapPinAnnotation!) -> MKAnnotationView! {
let reuseId = "pin"
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if pinView == nil {
//println("Pinview was nil")
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.animatesDrop = true
// Code to catch my custom CustomMapPinAnnotation so we can check the status and set the color
if annotation.isKindOfClass(CustomMapPinAnnotation)
{
println("FOUND OUR CustomMapPinAnnotation CLASS IN mapView")
println(" Custom Title = \(annotation.title)")
println(" Custom status passed = \(annotation.status)")
switch annotation.status {
case 0,1:
println("Case 0 or 1 - Setting to Red")
pinView!.pinColor = .Red
case 2:
println("Case 2 - Setting to Green")
pinView!.pinColor = .Green
case 3:
println("Case 3 - Setting to Purple")
pinView!.pinColor = .Purple
default:
println("Case default - Should Never Happen")
break;
} // switch
} // if
}
else {
pinView!.annotation = annotation
}
return pinView
} //func mapView
在 viewDidLoad 设置和 For 循环中设置注释
override func viewDidLoad() {
super.viewDidLoad()
// setup the region and Span
var theSpan:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
// Set the region to the the first element of the structure array.
var theRegion:MKCoordinateRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(MySupplierData[0].latitude, MySupplierData[0].longitude), theSpan)
// This set the Map Type (Standard, Satellite, Hybrid)
self.theMapView.mapType = MKMapType.Standard
// Now loop through the structure data from 1 top the end of the structure to map the data
var mytitle: String = ""
var mysubtitle: String = ""
var myCustomPinAnnotation: CustomMapPinAnnotation
for mystructindex = 0; mystructindex < MySupplierData.count; ++mystructindex {
println("INSIDE SUPPLIER LOOP INDEX = \(mystructindex)" )
switch MySupplierData[mystructindex].status {
case 0:
mytitle = "(Red) " + MySupplierData[mystructindex].company
case 1:
mytitle = "(Red) " + MySupplierData[mystructindex].company
case 2:
mytitle = "(Geeen) " + MySupplierData[mystructindex].company
case 3:
mytitle = "(Purple) " + MySupplierData[mystructindex].company
default:
mytitle = "? " + MySupplierData[mystructindex].company
}
mysubtitle = MySupplierData[mystructindex].subtitle
// Create the Custom Annotations with my added status code
myCustomPinAnnotation = CustomMapPinAnnotation(
coordinate: CLLocationCoordinate2DMake(MySupplierData[mystructindex].latitude,MySupplierData[mystructindex].longitude),
title: mytitle, // custom title
subtitle: mysubtitle, // custom subtitle
status: MySupplierData[mystructindex].status) // status that will drive pin color
// put this annotation in the view.
self.theMapView.addAnnotation(myCustomPinAnnotation)
} // For
// This line brings up the display with the specific region in mind, otherwise it seems to default to a US Map.
self.theMapView.setRegion(theRegion, animated: true)
} // viewDidLoad
调试输出显示 For 循环按预期执行到完成,以在 mapView 中的自定义 viewForAnnotation 获取之前创建 myCustomPinAnnotation内部自行执行。当我将 map 移动到即时 View 之外的区域时,我确实注意到 mapView 中的 viewForAnnotation 根据需要被调用我看到我的开关相应地执行,但引脚颜色并不总是正确的。初始显示 map 中的所有引脚每次都是正确的正是这些外部区域的问题,我目前一直在研究它们为何关闭。
最佳答案
首先,代码应该调用viewForAnnotation
明确地自己。
删除对 viewForAnnotation
的显式调用在addAnnotation
之后行。
viewForAnnotation
是一个委托(delegate)方法, map View 会在需要显示注释时自动调用它。如果它没有被自动调用,请确保 map View 的 delegate
属性已设置(例如 self
)。
第二个(也是真正的问题),代码假定viewForAnnotation
委托(delegate)方法只会在添加每个注释后立即调用一次。
事实并非如此,也无法保证。 map View 将调用 viewForAnnotation
每当它需要显示注释并且可以针对同一注释多次调用或在实际添加注释很久之后调用(例如,在用户平移或缩放 map 并且注释进入 View 之后)。
参见 does MKAnnotationView buffer its input queue?有关其他详细信息和其他答案的相关链接,包括示例代码。
基本上,您必须将影响注释 View 的属性与注释对象本身一起存储,并从 annotation
中检索这些属性。传递给 viewForAnnotation
的参数.
我对你的情况的建议是:
我假设您使用的是内置注释类 MKPointAnnotation
.而不是使用 MKPointAnnotation
这不允许您存储自定义 status
属性连同注释对象本身,要么:
创建一个实现 MKAnnotation
的自定义类协议(protocol),但也有 status
属性(property)。创建注释时设置此属性并从 annotation
中提取其值传递给 viewForAnnotation
的参数并设置 pinColor
因此。请参阅链接答案中的示例代码。
制作MySupplierData
中的对象他们自己 实现 MKAnnotation
的对象协议(protocol)。所以如果 MySupplierData
中的对象是某个类的实例,例如,Supplier
, 使 Supplier
类符合 MKAnnotation
协议(protocol),然后您可以添加 MySupplierData
调用 addAnnotation
时将对象本身添加到 map View 中.
关于ios - viewForAnnotation 混淆和迭代自定义 pinColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613511/
我正在创建自定义注释,并且正在尝试使用 dequeueReusableAnnotation。 引脚之间的区别在于用于引脚图像的 png。 我创建了 myAnnotation 类,并在创建注释时使用了此
扫描了所有类似的问题并尝试了所有可能的解决方案后,我仍然找不到适合我的情况的解决方案。我尝试在我的 MapView 上放置多个图钉,但似乎无法正常添加我的图钉。我在 viewDidLoad 方法中启动
在我的 viewForAnnotation 方法中,我在图钉右侧添加了一个详细信息披露按钮,但它会将 showsUserLocation 更改为红色图钉,并且在“当前位置”文本右侧有一个披露按钮。 如
我正在 map 上显示图钉,但无法自定义注释 View 的显示。出于某种原因,我的 viewForAnnotation 没有被调用。这是 didFinishLaunchingWithOptions 方
我已经添加UIViewController在 .h 中并已添加 -(void) viewDidLoad { self.mapView.delegate = self; } 但是 view
我已经实现了 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation {方法来更改 us
我正在尝试制作自定义注释。我制作了一个自定义注释类,我在其中设计了注释 View 。我试图在我的 Viewcontroller 中调用 viewForAnnotation 中的类。当我运行该应用程序时
最近我在我的应用程序中实现了 viewForAnnotation 方法,以使用我的注释的特征(图像、颜色等)。唯一的问题是,虽然该功能在我的代码中,但定位服务的行为很奇怪。蓝色位置标记不是“脉动”并且
我的 viewForAnnotation 在 iOS8 中运行良好,但在 iOS9 中不显示自定义图钉图像。图片路径没问题。 怎么了 ?谢谢! func mapView(mapView: MKMapV
在我花了 2 天时间搜索错误后,我不得不在这里寻求帮助。我有 MapViewController 并在 map 上放置了一些图钉。我从苹果代码示例的 MapCallouts 和 WeatherMap
我添加了这个: func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
目标是根据存储在结构数组中的某些值自定义引脚颜色。 根据此处的一些帮助,我实现了以下 viewForAnnotation 委托(delegate)方法,并且根据我的结构数据数组的大小在循环中迭代调用此
我正在尝试制作一张 map ,在那里我可以看到我当前的位置,并看到这条街叫什么。 到目前为止,我可以在我的 map 上放置图钉,但出于某种原因,我没有收到标注。并且我在我的 viewForAnnota
我知道这个问题之前已经被其他人问过,并且我之前已经在这个论坛上阅读过它们,但是到目前为止我已经尝试了所有建议的方法,但没有运气,所以我决定发布这个问题。 我在下面有这段代码,用于更改 MKMapVie
我将一个完美运行的 6.1 应用程序升级到了 Xcode 5/ios 7使用 MKMapKit 在 map View 上显示一些图钉。 现在注释图钉不显示了。我确定我的 mapview 委托(dele
我想创建基本的个人资料图像注释而不是默认注释图钉,但我不知道在这种情况下如何使用 viewForAnnotation。 有没有办法创建类似 tableView 页眉页脚 View 的 xib 文件?或
当我没有在 MKMapView 上设置委托(delegate)而是添加注释时,它们的图像如下所示: 但是,如果我像这样返回一个 MKAnnotationView: func mapView(_ map
我正在尝试在 MKMapView 上显示自定义图钉。这些图钉将具有自定义图像以及将显示值的 UILabel。 我能够成功创建带有标签的自定义图钉。现在标签显示静态值。我从像解析这样的后端服务中查询数据
我有不同的类(MKAnnotation 子类)代表 map 注释。 我将它们加载到 map 上,一切正常,但是当我移动或缩放 map 图钉时,它们的图像开始丢失。 当我平移 map viewForAn
我看过其他关于此的报告,但似乎没有一个适用。我们的应用程序因频繁(但无法可靠地重现)崩溃而瘫痪,如下所示: Thread 0 name: Dispatch queue: com.apple.main
我是一名优秀的程序员,十分优秀!