У меня есть пользовательская аннотация, у меня есть подкласс от MKPointAnnotation. Их добавление работает правильно. Мне также нужно определить метод выбора аннотации. Проблема в том, что когда я нажимаю на аннотацию, она сначала не попадает в «DidSelectAnnotationView». если я коснусь другой аннотации, такой как аннотация userLocation, то попадет "DidSelectAnnotationView". и во время отладки он показывает, что координаты представления аннотации - это не местоположение пользователя, а аннотация, которую я нажимал ранее. и то же самое происходит после этого, когда я нажимаю свою пользовательскую аннотацию, она попадает в метод, а координаты метода не совпадают с userLocation. Я добавил свой код, может ли кто-нибудь изучить его, где я пропустил биты.

override public MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
    {
        string resuseId = "customAnnotation";

        MKAnnotationView annotationView = mapView.DequeueReusableAnnotation(resuseId);

        if (ThisIsTheCurrentLocation(mapView, annotation))
        {
            return null;
        }

        if (annotationView == null)
        {
            if (annotation is CustomAnnotation)
            {

                switch (CustomAnnotation.MarkerType)
                {
                    case MyMarkerType.Note:
                        annotationView = new MKAnnotationView(annotation, resuseId);
                        annotationView.Image = UIImage.FromBundle("Message");
                        annotationView.CanShowCallout = false;
                        annotationView.Enabled = true;
                        break;
                    case MyMarkerType.Photo:
                        annotationView = new MKAnnotationView(annotation, resuseId);
                        annotationView.Image = UIImage.FromBundle("Photo");
                        annotationView.CanShowCallout = false;
                        break;
                    case MyMarkerType.Story:
                        annotationView = new MKAnnotationView(annotation, resuseId);
                        var Img = UIImage.FromBundle("Story");
                        annotationView.CanShowCallout = false;
                        break;
                    case MyMarkerType.Custom:
                        annotationView = new MKAnnotationView(annotation, resuseId);
                        //using (var data = NSData.FromArray(CustomAnnotation.WayPoint.Image))
                        //{
                        //    var image = UIImage.LoadFromData(data);
                        //        annotationView.Image = image;
                        //}
                        NSData data = NSData.FromArray(CustomAnnotation.WayPoint.Image);
                        UIImage image = UIImage.LoadFromData(data);
                       // UIImage finalImage = image.MaxResizeImage(21f, 20f);
                        annotationView.Image = image;
                        annotationView.CanShowCallout = false;
                        break;
                    default:
                        annotationView = new MKAnnotationView(annotation, resuseId);
                        //var imaget = FromUrl(CustomAnnotation.WayPoint.IconUrl);
                        //annotationView.Image = imaget;
                        break;
                }
            }

            else{
                annotationView.Annotation = annotation;
                annotationView.CanShowCallout = false;

                //(annotationView as MKPinAnnotationView).AnimatesDrop = false; // Set to true if you want to animate the pin dropping
                //(annotationView as MKPinAnnotationView).PinTintColor = UIColor.Red;
                annotationView.SetSelected(false, false);
            }

        }

        return annotationView;

    }

И мой метод DidSelect

public override void DidDeselectAnnotationView(MKMapView mapView, MKAnnotationView view)
    {

        if ( view.Annotation.Coordinate.Latitude == mapView.UserLocation.Coordinate.Latitude){

            return;
        }

        CLLocationCoordinate2D coordinates = view.Annotation.Coordinate;
        mapView.DeselectAnnotation(view.Annotation, false);
        // GetAnnotationClickInfo.Invoke(coordinates);


    }
0
Kopila Panth 1 Янв 2018 в 05:06

2 ответа

Лучший ответ

Используйте метод DidSelectAnnotationView,
не DidDeselectAnnotationView.

public override void DidSelectAnnotationView(MKMapView mapView, MKAnnotationView view)
0
Kosuke Ogawa 4 Янв 2018 в 06:25

После проверки вашего кода я думаю, что при инициализации этого annotationView произошла ошибка, вы должны поставить annotationView.Annotation = annotation; вне условия if (annotationView == null).

Измените свой код:

if (annotationView == null)
{
    if (annotation is CustomAnnotation)
    {
       //custom view logic
    }
    else  //not custom view
    {
        annotationView = new MKPinAnnotationView(annotation, annotationIdentifier);
    }
}
else
{
    annotationView.Annotation = annotation;
}

annotationView.CanShowCallout = false;
//(annotationView as MKPinAnnotationView).AnimatesDrop = false; // Set to true if you want to animate the pin dropping
//(annotationView as MKPinAnnotationView).PinTintColor = UIColor.Red;
annotationView.SetSelected(false, false);
0
Cole Xia - MSFT 1 Янв 2018 в 07:13