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.

¿Cómo puedo mostrar 2 vistas de anotaciones al mismo tiempo en Xamarin iOS?

¿Cómo puedo mostrar 2 vistas de anotaciones en un mapa de Xamarin iOS al mismo tiempo, como una flecha detrás del vehículo en su anterior Lat Long?
Estoy usando un renderizador personalizado en iOS pero solo puedo mostrar una imagen en el mapa, ya he logrado hacerlo en Android. Adjunto una captura de pantalla.
Estoy usando el paquete NuGet xamarin.forms.map y quiero obtener un resultado como en esta imagen. Llevo 20 días atascado aquí. Haz clic aquí para ver la captura de pantalla

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar dos vistas de anotación en un mapa de Xamarin iOS al mismo tiempo, como una cabeza de flecha detrás de un vehículo en su latitud y longitud anterior, sigue estos pasos:

    1. Crea un renderizador personalizado para el mapa en iOS.
    2. Sobrescribe el método GetViewForAnnotation en el renderizador personalizado.

    3. En el método GetViewForAnnotation, crea una vista personalizada (UIView) que muestre tanto la cabeza de flecha como el marcador de vehículo.

    4. Asegúrate de que la vista personalizada tenga sus propias subvistas (UIViews) para la cabeza de flecha y el marcador de vehículo.

    5. Establece el marco de la subvista de la cabeza de flecha en la latitud y longitud anterior del vehículo.

    6. Establece el marco de la subvista del marcador de vehículo en la latitud y longitud actual del vehículo.

    7. Devuelve la vista personalizada en el método GetViewForAnnotation para mostrarla en el mapa.

    Aquí tienes un código de muestra que se puede usar en el renderizador personalizado:

    public override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
    {
        if (annotation is MKUserLocation)
            return null;
    
        var annotationView = mapView.DequeueReusableAnnotation("pin") as CustomAnnotationView;
    
        if (annotationView == null)
        {
            var customView = new UIView(new RectangleF(0, 0, 50, 50));
            customView.BackgroundColor = UIColor.Clear;
    
            var arrowHeadView = new UIView(new RectangleF(0, 0, 10, 10));
            arrowHeadView.BackgroundColor = UIColor.Red;
            arrowHeadView.Layer.CornerRadius = 5;
            customView.AddSubview(arrowHeadView);
    
            var vehicleMarkerView = new UIView(new RectangleF(20, 20, 10, 10));
            vehicleMarkerView.BackgroundColor = UIColor.Green;
            vehicleMarkerView.Layer.CornerRadius = 5;
            customView.AddSubview(vehicleMarkerView);
    
            annotationView = new CustomAnnotationView(annotation, "pin", customView);
    
            // Establece otras propiedades de la vista de anotación, como las propiedades de llamada aquí.
        }
    
        var vehicleLocation = YourViewModel.VehicleLocation; // Obtén la ubicación actual del vehículo.
        var prevVehicleLocation = YourViewModel.PreviousVehicleLocation; // Obtén la ubicación anterior del vehículo.
    
        var vehicleCoordinate = new CLLocationCoordinate2D(vehicleLocation.Latitude, vehicleLocation.Longitude);
        var prevVehicleCoordinate = new CLLocationCoordinate2D(prevVehicleLocation.Latitude, prevVehicleLocation.Longitude);
    
        var arrowHeadFrame = mapView.GetViewForAnnotation(mapView.Annotations.FirstOrDefault(x => x.GetType() == typeof(CustomAnnotation) && ((CustomAnnotation)x).Location == prevVehicleLocation)).Frame;
    
        arrowHeadFrame.X = arrowHeadFrame.X - mapView.Frame.X;
        arrowHeadFrame.Y = arrowHeadFrame.Y - mapView.Frame.Y;
    
        annotationView.CustomView.Subviews.ElementAt(0).Frame = arrowHeadFrame;
        annotationView.CustomView.Subviews.ElementAt(1).CenterCoordinate = vehicleCoordinate;
    
        return annotationView;
    }
    
    public class CustomAnnotationView : MKAnnotationView
    {
        public UIView CustomView { get; set; }
    
        public CustomAnnotationView(IMKAnnotation annotation, string reuseIdentifier, UIView customView) : base(annotation, reuseIdentifier)
        {
            CustomView = customView;
            AddSubview(customView);
        }
    
        public override void SetSelected(bool selected, bool animated)
        {
            base.SetSelected(selected, animated);
    
            if (selected)
                CustomView.Alpha = 0.5f;
            else
                CustomView.Alpha = 1.0f;
        }
    }
    

    Nota: Este es solo un código de muestra y es posible que deba modificarse para adaptarse a tus necesidades específicas.

Comments are closed.