При загрузке MapKit Map на iOS 12.0 все выноски отображаются вместо скрытых - PullRequest
0 голосов
/ 25 сентября 2018

Контекст

У меня есть приложение Xamarin Forms, которое использует собственные карты (Google Maps на Android, Apple Mapkit на iOS).После тестирования на различных телефонах и планшетах Android и Apple карта отображается правильно, за исключением iPhone 6 под управлением iOS 12.0. Это странно, особенно если учесть, что карта работает на iPhone старше и новее, чем iPhone 6. На самом деле проблема, похоже, связана с последней версией iOS;обновление приложения до 12.0 приводит к неправильному отображению карты.На карте много аннотаций, и все аннотации имеют выноски.

Ожидаемое поведение:

Аннотации карты отображаются после открытия карты.Пользователь должен иметь возможность нажать на аннотацию, чтобы открыть связанную выноску, а при нажатии на выноску они переходят на другую страницу.

Фактическое поведение:

Вкл. iPhone 6 iOS 12.0, отображаются аннотации карты, но также отображаются все выноски и приложение зависает.Когда пользователь нажимает на выноску, приложение вылетает.

Дополнительная информация: Мы используем FreshMvvm в качестве нашей Mvvm Framework.Мы используем пользовательские рендеры карт.Основная структура рендера карт выглядит так:

public class IosDefaultMapRenderer : MapRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<View> e)
    {
        base.OnElementChanged(e);

        var nativeMap = Control as MKMapView;
        if (e.OldElement != null && nativeMap != null)
        {
            nativeMap.RemoveAnnotations(nativeMap.Annotations);
            nativeMap.GetViewForAnnotation = null;
            nativeMap.CalloutAccessoryControlTapped -= OnCalloutAccessoryControlTapped;
            nativeMap.DidSelectAnnotationView -= OnDidSelectAnnotationView;
            nativeMap.DidDeselectAnnotationView -= OnDidDeselectAnnotationView;
            if (nativeMap.Overlays != null)
            {
                nativeMap.RemoveOverlays(nativeMap.Overlays);
            }
        }
        if (e.NewElement == null)
        {
            return;
        }
        _formsMap = (DefaultMap)e.NewElement; // Map from Xamarin Forms
        customPins = _formsMap.CustomPins;
        if (nativeMap == null) return;
        nativeMap.GetViewForAnnotation = GetViewForAnnotation;
        nativeMap.CalloutAccessoryControlTapped += OnCalloutAccessoryControlTapped;
        nativeMap.DidSelectAnnotationView += OnDidSelectAnnotationView;
        nativeMap.DidDeselectAnnotationView += OnDidDeselectAnnotationView;
        AddCustomPins(nativeMap);
    }

    protected void AddCustomPins (MKMapView nativeMap)
    {
        foreach (CustomPin customPin in customPins)
        {
            // Generate Annotation
            //

            // Add annotation
            nativeMap.AddAnnotation(annotation);
        }
    }

    protected void MapRendererOnElementChanged(ElementChangedEventArgs<View> e)
    {
        base.OnElementChanged(e);
    }

    public virtual MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
    {
        var description = new UILabel();
        var detailButton = UIButton.FromType(UIButtonType.DetailDisclosure);
        var annotationView = mapView.DequeueReusableAnnotation(AnnotationIdentifier);

        if (annotationView == null)
        {
            annotationView = new MKAnnotationView(annotation, AnnotationIdentifier);
        }
        else
        {
            annotationView.Annotation = annotation;
        }

        // Set annotationView and description properties from customPin data
        //

        return annotationView;
    }


    public void OnDidSelectAnnotationView(object sender, MKAnnotationViewEventArgs e)
    {
        // ...
    }

    protected virtual void OnCalloutAccessoryControlTapped(object sender, MKMapViewAccessoryTappedEventArgs e)
    {
        // navigate to another page
    }

    public void OnDidDeselectAnnotationView(object sender, MKAnnotationViewEventArgs e)
    {
        // ...
    }
}

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Это очень просто.Чтобы скрыть выноски для iOS12, нам просто нужно немного переместить карту, изменив регион карты.

Вы можете попробовать это.Вызовите метод ниже из 'mapview didAdd views'

var isiOS12issueDone: Bool = false (Global variable)

func handleiOS12issue()
{
    if (isiOS12OrLater() && isiOS12issueDone == false)
    {
        var region = mvMapView!.region
        region.center.latitude += 0.000001
        mvMapView!.region = region

        isiOS12issueDone = true
    }
}
0 голосов
/ 26 сентября 2018

Я переместил логику с OnDidSelectAnnotationView на GetViewForAnnotation.

Это исправило сбой приложения при нажатии на выноску.

Я также удалил строку, из которой устанавливается аннотация навыбран.GetViewForAnnotation, кажется, вызывается один раз для всех аннотаций после загрузки карты, поэтому все аннотации выбираются.Это странно, поскольку в предыдущей версии iOS такого не было.

...