2017-09-15 4 views
0

J'implémente un moteur de rendu personnalisé pour Xamarin Forms Map afin de mettre en œuvre un événement Tap.Xmasquins Forms Map Tap Gesture IOS

Je le PCL je ce code:

public class ExtMap : Map 
    { 
     /// <summary> 
     /// Event thrown when the user taps on the map 
     /// </summary> 
     public event EventHandler<MapTapEventArgs> Tapped; 

     #region Constructors 

     /// <summary> 
     /// Default constructor 
     /// </summary> 
     public ExtMap() 
     { 

     } 

     /// <summary> 
     /// Constructor that takes a region 
     /// </summary> 
     /// <param name="region"></param> 
     public ExtMap(MapSpan region) 
      : base(region) 
     { 

     } 

     #endregion 

     public void OnTap(Position coordinate) 
     { 
      OnTap(new MapTapEventArgs { Position = coordinate }); 
     } 

     protected virtual void OnTap(MapTapEventArgs e) 
     { 
      var handler = Tapped; 

      if (handler != null) 
       handler(this, e); 
     } 
    } 

Et dans mon projet IOS ce code:

public class ExtMapRenderer : MapRenderer 
    { 
     private readonly UITapGestureRecognizer _tapRecogniser; 

     public ExtMapRenderer() 
     { 
      _tapRecogniser = new UITapGestureRecognizer(OnTap) 
      { 
       NumberOfTapsRequired = 1, 
       NumberOfTouchesRequired = 1 
      }; 
     } 

     private void OnTap(UITapGestureRecognizer recognizer) 
     { 
      var cgPoint = recognizer.LocationInView(Control); 

      var location = ((MKMapView)Control).ConvertPoint(cgPoint, Control); 

      ((ExtMap)Element).OnTap(new Position(location.Latitude, location.Longitude)); 
     } 

     protected override void OnElementChanged(ElementChangedEventArgs<View> e) 
     { 
      if (Control != null) 
       Control.RemoveGestureRecognizer(_tapRecogniser); 

      base.OnElementChanged(e); 

      if (Control != null) 
      { 
       var nativeMap = Control as MKMapView; 
       nativeMap.ShowsUserLocation = true; 
       Control.AddGestureRecognizer(_tapRecogniser); 
      } 

     } 
    } 

Dans le simulateur parfois l'événement est déclenché, mais je dois cliquer au hasard un beaucoup de temps sur la carte. Dans mon iPhone, l'événement n'est jamais déclenché.

Dans le téléphone Android & Emulator, l'événement fonctionne correctement, donc je soupçonne une mauvaise implémentation dans IOS Project mais je ne sais pas comment je peux l'améliorer.

Répondre

1

J'ai un rendu de carte iOS où tap fonctionne correctement.

Mon OnElementChanged est un peu différente de la vôtre:

private MKMapView Map => Control as MKMapView; 

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

    if (e.OldElement != null && Map != null) 
    { 
     Control?.RemoveGestureRecognizer(_tapRecogniser); 
    } 

    if (e.NewElement != null) 
    { 
     Control?.AddGestureRecognizer(_tapRecogniser); 
    } 
} 
+0

Il est préférable, mais parfois il ne fonctionne pas .... Dans ma précédente mise en œuvre, je ne travaille pas du tout MKMapView, ce possible que je manqué quelque chose? – OrcusZ