es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué reemplaza a MGLAnnotationView en la versión 10 de Mapbox?

En nuestra aplicación, utilizamos en gran medida MGLAnnotationViews debido a su flexibilidad.

Podemos animar anotaciones en el mapa con una MGLAnnotationView.

Por ejemplo, un efecto pulsante en una anotación es algo que es fundamental para nuestra aplicación.

Anteriormente en la versión 6, logramos nuestro efecto pulsante de la siguiente manera:

class CustomAnnotationView: MGLAnnotationView {
let pointFeature: MGLPointFeature
let reuseId: String
let customPulse = CustomPulseLayer() // CAReplicatorLayer

init(pointFeature: MGLPointFeature, showPulse: Bool) {
    self.pointFeature = pointFeature
    self.reuseId = self.identifier(forFeature: pointFeature)
    super.init(annotation: pointFeature, reuseIdentifier: self.reuseId)
    self.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
    self.layer.cornerRadius = bounds.width / 2
    self.backgroundColor = .systemBlue
    self.addSubview(pointImageView)

    if showPulse {
        layer.addSublayer(customPulse)
        customPulse.start()
    }
}

private lazy var pointImageView: UIImageView = {
    let imageView = UIImageView(frame: self.frame)
    let image = self.imageBasedOnIdentifier(self.reuseId)
    imageView.image = image
    return imageView
}()

}

¿Alguien sabría cómo lograr lo mismo en la versión 10 de Mapbox?

Tags:  ,

Answer

  1. Avatar for davy.ai

    En la versión 10, podemos lograr el mismo efecto de pulsación mediante:

    class CustomAnnotationView: MGLAnnotationView {
        let pointFeature: MGLPointFeature
        let reuseId: String
        let customPulse = CAShapeLayer()
    
        init(pointFeature: MGLPointFeature, showPulse: Bool) {
            self.pointFeature = pointFeature
            self.reuseId = self.identifier(forFeature: pointFeature)
            super.init(annotation: pointFeature, reuseIdentifier: self.reuseId)
            self.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
            self.layer.cornerRadius = bounds.width / 2
            self.backgroundColor = .systemBlue
            self.addSubview(pointImageView)
    
            if showPulse {
                layer.addSublayer(customPulse)
                customPulse.fillColor = UIColor.systemBlue.cgColor
                customPulse.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 24, height: 24)).cgPath
                let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
                scaleAnimation.duration = 1.5
                scaleAnimation.fromValue = 0.2
                scaleAnimation.toValue = 1.0
                scaleAnimation.autoreverses = true
                scaleAnimation.repeatCount = .infinity
                customPulse.add(scaleAnimation, forKey: "scale")
            }
        }
    
        private lazy var pointImageView: UIImageView = {
            let imageView = UIImageView(frame: self.frame)
            let image = self.imageBasedOnIdentifier(self.reuseId)
            imageView.image = image
            return imageView
        }()
    }
    

Comments are closed.