MKMapView触摸事件

问题描述:

在我的mapview上,当用户滚动并停止时,我想将我的web服务发送到地图中心的纬度。我的问题是我想在用户停止在地图上移动之后触发事件。目前发生的事情是事件马上被解雇。我目前使用的触摸事件MKMapView触摸事件

TouchesBegin TouchesCancelled TouchesEnded

这是我所看到的在一个模拟器上

TouchesBegin总是被调用运行时,当用户触摸屏幕时 TouchesCancelled被称为如果我移动地图。但它在触摸开始后立即调用并且 不当用户停止移动地图时 当用户刚刚触摸地图并在触摸开始后立即调用时,会调用TouchesEnd。

 #region ToucheEvents 

    public override void TouchesBegan(NSSet touches, UIEvent evt) 
    { 
     base.TouchesBegan(touches, evt); 

     Console.WriteLine("Touchs Begin"); 
     _cancelTokenSource.Cancel(); 

     _operationMode = ParkingOperationMode.ParkingNotAvailable; 
     UpdateUi(); 
    } 


    public override void TouchesCancelled(NSSet touches, UIEvent evt) 
    { 
     base.TouchesCancelled(touches, evt); 

     Console.WriteLine("Touchs Cancelled"); 

     MapViewOnRegionChanged(); 
    } 


    public override void TouchesEnded(NSSet touches, UIEvent evt) 
    { 
     base.TouchesEnded(touches, evt); 
     Console.WriteLine("Touched Ended"); 

     _cancelTokenSource.Cancel(); 
    } 

    #endregion 

private void MapViewOnRegionChanged() 
    { 
     _cancelTokenSource = new CancellationTokenSource(); 
     _cancelToken = _cancelTokenSource.Token; 
     _cancelToken.Register(CancelCallBack); 

     if (Utility.ValidateOnlineStatus()) 
     { 
      ViewDef.ShowLoadingAnimation(); 
      Utility.AddNetworkConnection(); 

      Task.Run(() => 
      { 
       Thread.Sleep(1000); 

       if (!_cancelToken.IsCancellationRequested) 
       { 
        _cancelToken.ThrowIfCancellationRequested(); 
        Console.WriteLine("Firing GetLocation"); 

        GetParkingLocation(); 
       } 
       else { 
        Console.WriteLine("Location Cancelled"); 
       } 
      }, _cancelToken); 
     } 
    } 

我认为这样做的首选方法是创建您自己的地图代表,以响应地图视图事件。通过这种方式,您可以监视用户与之交互的对地图视图的更改以及以编程方式更改区域的代码

public override void ViewDidLoad() 
{ 
    var customDelegate = new CustomMapViewDelegate(); 
    customDelegate.OnRegionChanged += TheMapView_OnRegionChanged; 

    TheMapView.Delegate = customDelegate; 
} 

public void TheMapView_OnRegionChanged(object sender, MKMapViewChangeEventArgs e) 
{ 
    var latitude = TheMapView.Region.Center.Latitude; 
    var longitude = TheMapView.Region.Center.Longitude; 

    // Map change logic goes here 
} 

public class CustomMapViewDelegate : MKMapViewDelegate 
{ 
    public event EventHandler<MKMapViewChangeEventArgs> OnRegionChanged; 

    public override void RegionChanged(MKMapView mapView, bool animated) 
    { 
     if (OnRegionChanged != null) 
     { 
      OnRegionChanged(mapView, new MKMapViewChangeEventArgs(animated)); 
     } 
    } 
}