Контекст
У меня есть приложение 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)
{
// ...
}
}