繁体   English   中英

MKMapView Touch事件

[英]MKMapView Touch events

在我的mapview上,当用户滚动并停止时,我想向我的网络服务发送地图中心的纬度。 我的问题是我想在用户停止在地图上移动后触发事件。 当前发生的事件是立即触发。 我目前正在使用触摸事件

触摸开始触摸取消的触摸结束

这是我在模拟器上运行时看到的

如果我移动地图,则总是在用户触摸屏幕时调用TouchesBegin。 但是在触摸开始后立即调用,而不是在用户停止移动地图时调用,当用户刚刚触摸地图时调用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));
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM