2017-09-15 1 views
0

Ich implementiere einen benutzerdefinierten Renderer für Xamarin Forms Map, um ein Tap-Ereignis zu implementieren.Xamarin Forms Map Tippen Sie auf Gesture IOS

ich die PCL Ich habe diesen 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); 
     } 
    } 

Und in meinem IOS-Projekt diesen 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); 
      } 

     } 
    } 

Im Simulator manchmal wird das Ereignis ausgelöst hat, aber ich habe zufällig einen Klick viel Zeit in der Karte. In meinem iPhone wird das Ereignis nie ausgelöst.

In Android-Handy & Emulator, das Ereignis funktioniert ordnungsgemäß, so vermute ich eine schlechte Umsetzung in IOS-Projekt, aber ich weiß nicht, wie ich es verbessern kann.

Antwort

1

Ich habe einen iOS-Map-Renderer, wo Tap funktioniert ordnungsgemäß.

Mein OnElementChanged ist ein bisschen anders zu verkaufen:

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

Es ist besser, aber manchmal hat es nicht funktioniert .... In meinem vorherigen Implementierung i mit MKMapView überhaupt nicht funktionieren, dass möglich, dass ich verpasst etwas? – OrcusZ

Verwandte Themen