Swift - Пользовательский UIView для MKAnnotationView PIN-код карты - PullRequest
0 голосов
/ 05 июля 2018

Как мне установить пользовательский вид для MKAnnotationView? Я хочу, чтобы мои выводы на карте выглядели уникально через UIView. У этого подкласса UIView могут быть другие представления, которые я хочу настроить.

В Интернете есть много примеров того, как установить изображение аннотации, но не как на самом деле изменить эту аннотацию:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
    {
        if !(annotation is MKPointAnnotation) {
            return nil
        }

        let annotationIdentifier = "AnnotationIdentifier"
        var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier)

        if annotationView == nil {
            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
            annotationView!.canShowCallout = true
        }
        else {
            annotationView!.annotation = annotation
        }

        let pinImage = UIImage(named: "customPinImage")
        annotationView!.image = pinImage

       return annotationView   
    }

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

MKAnnotationView - это подкласс UIView, который может быть разделен на подклассы.

Так что вам просто нужно создать подкласс MKAnnotationView.

Custom Subview

Вот простой пример, который показывает синий треугольник. Поскольку вы упомянули, что в пользовательском подклассе UIView должны быть другие представления, я добавил метку, которая должна показывать число.

class CustomAnnotationView: MKAnnotationView {
    private let annotationFrame = CGRect(x: 0, y: 0, width: 40, height: 40)
    private let label: UILabel

    override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
        self.label = UILabel(frame: annotationFrame.offsetBy(dx: 0, dy: -6))
        super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
        self.frame = annotationFrame
        self.label.font = UIFont.systemFont(ofSize: 24, weight: .semibold)
        self.label.textColor = .white
        self.label.textAlignment = .center
        self.backgroundColor = .clear
        self.addSubview(label)
    }

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

    public var number: UInt32 = 0 {
        didSet {
            self.label.text = String(number)
        }
    }

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }

        context.beginPath()
        context.move(to: CGPoint(x: rect.midX, y: rect.maxY))
        context.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
        context.addLine(to: CGPoint(x: rect.minX, y: rect.minY))
        context.closePath()

        UIColor.blue.set()
        context.fillPath()
    }

}

Метод MKMapViewDelegate

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    guard annotation is MKPointAnnotation else { return nil }

    let customAnnotationView = self.customAnnotationView(in: mapView, for: annotation)
    customAnnotationView.number = arc4random_uniform(10)
    return customAnnotationView
}

Пользовательский вид аннотации

private func customAnnotationView(in mapView: MKMapView, for annotation: MKAnnotation) -> CustomAnnotationView {
    let identifier = "CustomAnnotationViewID"

    if let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? CustomAnnotationView {
        annotationView.annotation = annotation
        return annotationView
    } else {
        let customAnnotationView = CustomAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        customAnnotationView.canShowCallout = true
        return customAnnotationView
    }
}

Результат

Результат будет выглядеть так:

custom annotation view

0 голосов
/ 05 июля 2018

Ранее я использовал UIView, чтобы комментировать MKAnnotationView. Я сделал это, добавив представление как подпредставление к MKAnnotationView, но вскоре обнаружил, что это вызывает массу проблем с памятью при отображении большого количества комментариев на моей карте. Вместо этого я вернулся к созданию UIView, состоящего из моих различных подпредставлений, а затем преобразовал его в UIImage и присвоил его свойству image MKAnnotationView.

Вот ссылка на ответ переполнения стека, которая поможет с преобразованием UIView в UIImage.

...