Пользовательский кластерAnnotationView с 3-х цветным контуром - PullRequest
0 голосов
/ 22 января 2019

Как получить пользовательские представления аннотаций кластеризации с соотношением трех разных типов вместо двух, как в примере кода от Apple?

Как отобразить три различных контура обводки на изображении кластера в кружке (кружок с контурным 3-цветным кольцом / контур обводки)?

Пример:

Apple, TANDm-Приложение "Decluttering a Map", WWDC2017No237 с одноколесными велосипедами и трехколесными велосипедами в качестве отдельных аннотаций.Они делают только велосипеды и трехколесные велосипеды в соотношении как UIImage.

Вопрос:

Как получить дополнительный piePath- "unicycleColor" внутри функции "drawRatio" как пользовательский clusterAnnotationView?

TANDm - приложение - код

класс ClusterAnnotationView.swift:

import MapKit

/// - Tag: ClusterAnnotationView
class ClusterAnnotationView: MKAnnotationView {

override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
    super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
    collisionMode = .circle
    centerOffset = CGPoint(x: 0, y: -10) // Offset center point to animate better with marker annotations
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

/// - Tag: CustomCluster
override func prepareForDisplay() {
    super.prepareForDisplay()

    if let cluster = annotation as? MKClusterAnnotation {
        let totalBikes = cluster.memberAnnotations.count

        if count(cycleType: .unicycle) > 0 {
            image = drawUnicycleCount(count: totalBikes)
        } else {
            let tricycleCount = count(cycleType: .tricycle)
            image = drawRatioBicycleToTricycle(tricycleCount, to: totalBikes)
        }

        if count(cycleType: .unicycle) > 0 {
            displayPriority = .defaultLow
        } else {
            displayPriority = .defaultHigh
        }
    }
}

private func drawRatioBicycleToTricycle(_ tricycleCount: Int, to totalBikes: Int) -> UIImage {
    return drawRatio(tricycleCount, to: totalBikes, fractionColor: UIColor.tricycleColor, wholeColor: UIColor.bicycleColor)
}

private func drawUnicycleCount(count: Int) -> UIImage {
    return drawRatio(0, to: count, fractionColor: nil, wholeColor: UIColor.unicycleColor)
}
// func zeichneVerhältnis(Farbelement: Ganzzahl, zum Gesamtkreis: Ganzzahl, FragmentFarbwahl, GesamtFarbwahl) Rückgabewert Standardfarbe { let Vorausberechnung der Breite und Höhe sowie Rückgabe des berechneten Images { Füllung des Kreisen = wholeColor, Farbsegment auf Pie übertragen,

 private func drawRatio(_ fraction: Int, to whole: Int, fractionColor: UIColor?, wholeColor: UIColor?) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: CGSize(width: 40, height: 40))
    return renderer.image { _ in
        // Fill full circle with wholeColor
        wholeColor?.setFill()
        UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 40, height: 40)).fill()

        // Fill pie with fractionColor
        fractionColor?.setFill()
        let piePath = UIBezierPath()
        piePath.addArc(withCenter: CGPoint(x: 20, y: 20), radius: 20,
                       startAngle: 0, endAngle: (CGFloat.pi * 2.0 * CGFloat(fraction)) / CGFloat(whole),
                       clockwise: true)
        piePath.addLine(to: CGPoint(x: 20, y: 20))
        piePath.close()
        piePath.fill()

        // Fill inner circle with white color
        UIColor.white.setFill()
        UIBezierPath(ovalIn: CGRect(x: 8, y: 8, width: 24, height: 24)).fill()

        // Finally draw count text vertically and horizontally centered
        let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.black,
                           NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 20)]
        let text = "\(whole)"
        let size = text.size(withAttributes: attributes)
        let rect = CGRect(x: 20 - size.width / 2, y: 20 - size.height / 2, width: size.width, height: size.height)
        text.draw(in: rect, withAttributes: attributes)
    }
}

private func count(cycleType type: Cycle.CycleType) -> Int {
    guard let cluster = annotation as? MKClusterAnnotation else {
        return 0
    }

    return cluster.memberAnnotations.filter { member -> Bool in
        guard let bike = member as? Cycle else {
            fatalError("Found unexpected annotation type")
        }
        return bike.type == type
    }.count
}
}

Есть идеи, советы или решение, чтобы приблизиться к дополнительной функции piePath / strokePath в tat?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...