我从Parses后端查询了一系列NSData对象(转换后会变成图像),如下所示:
var query = PFUser.query()
query.whereKey("location", nearGeoPoint:geopoint)
query.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]!, error: NSError!) -> Void in
for object in objects {
var user:PFUser = object as PFUser
var otherUserImages = [NSData]()
otherUserImages.append(user["image"] as NSData)
}
})
我现在有一个NSData对象数组,我想将它们用作图像作为地图上的注释。
所以我创建了一个函数:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
for userImage in self.otherUserImages {
view.canShowCallout = true
var dataImage = UIImage(data: userImage)
var userMapImage = UIImageView(image: dataImage)
view.leftCalloutAccessoryView = userMapImage
}
}
现在这会将图像作为注释放置,但仅在array[0]
我似乎无法将所有图像作为注释?
有人可以告诉我我错过了什么吗?
答案 0 :(得分:0)
我不清楚您是想将每个图像作为注释处理,还是希望将所有图像作为单个注释处理。
在第一种情况下,您似乎错误地使用了mapView:viewForAnnotation:
方法。
我认为您已创建MKAnnotation
个对象并将其添加到MKMapView
,因为mapView:viewForAnnotation:
已正确调用。
现在,您应该考虑的是为每个注释调用mapView:viewForAnnotation:
。然后,对于每个调用,您应该返回MKPinAnnotationView
,并且您应该将单个图像(视图)与每个图像相关联。因此,您需要定义一种机制,以便将MKAnnotation
个对象与图像相关联,然后在mapView:viewForAnnotation:
中使用该图像。如果您提供有关MKAnnotation
的更多详细信息,我可以进一步提供帮助。
另一方面,你可以想到"加入"将您的所有图像合并为一个UIView
以与单个注释相关联。在这种情况下,你会做这样的事情:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
var imageView = UIView(frame:...)
view.leftCalloutAccessoryView = userMapImage
for userImage in self.otherUserImages {
view.canShowCallout = true
var dataImage = UIImage(data: userImage)
var userMapImage = UIImageView(image: dataImage)
imageView.addSubview(userMapImage)
}
}
老实说,我不确定"加入"将所有图像合二为一,但你会更清楚......
在另一枚硬币上,您还应该考虑Reusing Annotation Views
编辑:
您需要建立的是annotationCustom
个对象与self.otherUserImages
中的对象之间的关系。我不知道你是怎么做到的。也许您需要在annotationCustom
课程中添加新属性来保存代表图片的NSData
...或者您可能更愿意将self.otherUserImages
转换为NSDictionary
和将每个注释name
与相应的图像数据相关联。
完成后,您可以使用
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
if let myAnnotation = annotation as? annotationCustom {
view.canShowCallout = true
var dataImage = myAnnotation.dataForImage
var userMapImage = UIImageView(image: dataImage)
view.leftCalloutAccessoryView = userMapImage
}
return view;
}
完成上述工作后,您可以考虑使用dequeue
来提高性能和内存使用率:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
static NSString *viewIdentifier = @"annotationView";
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
if (annotationView == nil) {
if let myAnnotation = annotation as? annotationCustom {
view.canShowCallout = true
var dataImage = myAnnotation.dataForImage
var userMapImage = UIImageView(image: dataImage)
view.leftCalloutAccessoryView = userMapImage
}
return view;
}
我希望myAnnotation.dataForImage
位足够清楚......