在iOS

时间:2018-03-19 17:22:24

标签: ios swift mapkit

我需要显示圆形和多边形的地图,每个圆形或多边形可能是不同的颜色。

我最初的计划是继承MKCircle和MKPolygon,并为我的Region类添加一个实例变量(其中包含将确定地图上形状颜色的信息)但是不可能将这两个中的任何一个子类化为

有什么想法吗?

这是我到目前为止所做的:

// draw the regions
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKCircle {
        // display circles on the map
        let circle = MKCircleRenderer(overlay: overlay)


        circle.strokeColor = UIColor.red // THIS SHOULD BE CONDITIONAL (sometimes red, sometimes green -> depends on a class that I have called region)
        circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
        circle.lineWidth = 1
        return circle
    } else if overlay is MKPolygon {
        // display polygons on the map
        let poly = MKPolygonRenderer(overlay: overlay)
        poly.strokeColor = UIColor.red // THIS SHOULD BE CONDITIONAL (sometimes red, sometimes green -> depends on a class that I have called region)
        poly.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
        poly.lineWidth = 1
        return poly
    } else {
        return MKPolylineRenderer()
    }
}

2 个答案:

答案 0 :(得分:0)

您说您能'吨子MKCircle或MKPolygon,所以你没有办法通过这个覆盖到在overlay参数委托方法相关的额外信息

可以做的是编写符合MKOverlay协议的自己的NSObject子类。现在您可以添加任何您喜欢的实例属性。为简单起见,您的MKOverlay采用者本身可以包装MKCircle或MKPolygon,但实际上并不需要这样做。

答案 1 :(得分:0)

我知道它是一个旧线程,但是我想我会分享我的操作方式

我使用扩展的存储属性来创建一个变量,该变量可以区分MKCircle是我需要的成员还是地方

这是示例代码:

extension MKCircle {
    
    enum type {
        case place
        case member
    }
    
    private static var savedCircleType: type = .member
    
    var circleType : type {
        get{
            return MKCircle.savedCircleType
        }
        set(newValue) {
            MKCircle.savedCircleType = newValue
        }
    }
    
}

添加注释时,请执行此操作

let circle = MKCircle(center: currentLocationPin.coordinate, radius: 200)
circle.circleType = .member // or .place in my case
self.mapView.addOverlay(circle)
self.mapView.addAnnotation(currentLocationPin)

最后在MKMapView委托中

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay is MKCircle {
            let circleRenderer = MKCircleRenderer(overlay: overlay)
            let color: UIColor = (circleRenderer.circle.circleType == .place) ? .themeGreen : .red
            circleRenderer.strokeColor = color
            circleRenderer.fillColor = color.withAlphaComponent(0.3)
            circleRenderer.lineWidth = 2.0
            return circleRenderer
        } else {
            return MKPolylineRenderer()
        }
    }

结果: https://i.stack.imgur.com/ApH9I.jpg