我试图通过self.mapView.annotations
遍历注释数组。
我遇到的问题是,我得到了一个错误,因为坐标不可用:从iOS 7和更早版本开始被弃用的api对Swift不可用。
有什么办法可以解决这个问题吗?我查看了iOS开发人员库,但找不到任何方法来获取每个注释的坐标。
var zoomRect:MKMapRect = MKMapRectNull;
for (index,annotation) in enumerate(self.mapView.annotations) {
var annotationPoint:MKMapPoint = MKMapPointForCoordinate(annotation.coordinate)
var pointRect:MKMapRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
self.mapView.setVisibleMapRect(zoomRect, animated: true)
此代码的主要思想是将地图居中,以便用户能够看到所有注释。我在目标C(SO的另一个问题)中得到了这个代码,并将其转换为Swift,但仍然没有成功。
最佳答案
annotations
的MKMapView
属性返回[AnyObject]!
AnyObject
不具有coordinate
属性。
必须转换为[MKAnnotation]
数组:
var zoomRect = MKMapRectNull
for annotation in self.mapView.annotations as [MKAnnotation] {
let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1)
zoomRect = MKMapRectUnion(zoomRect, pointRect)
}
(代码中不需要显式类型注释,并且变量
循环内部实际上是常量,因此可以用
let
声明它们)请注意,可以使用reduce操作替换for循环:
let zoomRect = reduce(self.mapView.annotations as [MKAnnotation], MKMapRectNull) {
rect, annotation in
let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1)
return MKMapRectUnion(rect, pointRect)
}