2014-10-01 163 views
0

我在手機上運行以下測試代碼。它在我的GeoFence所在的地圖上顯示一個圓圈。如果我走到籬笆外面,然後退回去,事件永遠不會發射。我不知道我在想念着什麼:Xamarin IOS無法讓GeoFencing正常工作

using MonoTouch; 
using CoreLocation; 
using MapKit; 
using System.Drawing; 
using CoreGraphics; 

namespace GeoFencingTest 
{ 
    public class GeoFencingController : UIViewController 
{ 
    UIWindow Parent; 
    CustomMapView mapView; 
    CLLocationManager locMgr = new CLLocationManager(); 
    UITextView textview; 
    UIButton button; 
    CLCircularRegion region; 
    CLLocationCoordinate2D FenceCenter; 


    public GeoFencingController (UIWindow parent) 
    { 
     var radius = 25; 
     FenceCenter = new CLLocationCoordinate2D (33.8399522334765, -84.3729872355209); 

     Parent = parent; 
     View = new UIView (new RectangleF ((float)Parent.Bounds.Left, (float)Parent.Bounds.Top, (float)Parent.Bounds.Width, (float)Parent.Bounds.Height)); 
     parent.AddSubview (View); 

     locMgr.RequestWhenInUseAuthorization(); 
     locMgr.DesiredAccuracy = 5; 
     locMgr.StartUpdatingLocation(); 

     region = new CLCircularRegion (FenceCenter, radius, "TPM"); 
     locMgr.StartMonitoring (region); 

     mapView = new CustomMapView(); 
     mapView.Frame = new RectangleF ((float)Parent.Bounds.Left + 20, (float)55, (float)Parent.Bounds.Width - 40, (float)Parent.Bounds.Height - 80); 
     mapView.ShowsUserLocation = true; 
     mapView.UserInteractionEnabled = true; 
     mapView.MapType = MKMapType.Hybrid; 
     mapView.ZoomEnabled = true; 
     mapView.ScrollEnabled = true; 
     mapView.UserTrackingMode = MKUserTrackingMode.Follow; 
     mapView.Delegate = new MapDelegate(); 
     mapView.CenterCoordinate = FenceCenter; 

     View.AddSubview (mapView); 

     var circleOverlay = MKCircle.Circle (new CLLocationCoordinate2D (FenceCenter.Latitude, FenceCenter.Longitude), radius); 
     mapView.AddOverlay (circleOverlay); 

     textview = new UITextView (new RectangleF (0, 20, 190, 50)); 
     View.AddSubview (textview); 


     if (CLLocationManager.IsMonitoringAvailable (typeof(CLCircularRegion))) { 

      locMgr.DidStartMonitoringForRegion += (o, e) => { 
       textview.Text = "Now monitoring region " + e.Region.ToString(); 
      }; 

      locMgr.RegionEntered += (o, e) => { 
       textview.Text = "Just entered " + e.Region.ToString(); 
      }; 

      locMgr.RegionLeft += (o, e) => { 
       textview.Text = "Just left " + e.Region.ToString(); 
      }; 


     } else { 
      textview.Text = "This app requires region monitoring, which is unavailable on this device"; 
     } 
    } 

    public class MapDelegate : MKMapViewDelegate 
    { 


     public override MKOverlayView GetViewForOverlay (MKMapView mapView, NSObject overlay) 
     { 
      // return a view for the polygon 
      MKCircle circle = overlay as MKCircle; 
      MKCircleView circleView = new MKCircleView (circle); 
      circleView.FillColor = UIColor.Yellow; 
      circleView.Alpha = 0.5f; 
      circleView.LineWidth = 10; 
      circleView.StrokeColor = UIColor.Red; 
      return circleView; 
     } 
    } 

    public class CustomMapView : MKMapView 
    { 
     public override void TouchesBegan (NSSet touches, UIEvent evt) 
     { 
      base.TouchesBegan (touches, evt); 

      UITouch touch = touches.AnyObject as UITouch; 
      CGPoint pointInView = touch.LocationInView (this); 
      CLLocationCoordinate2D touchCoordinates = base.ConvertPoint (pointInView, this); 
      MKMapPoint mapPoint = MKMapPoint.FromCoordinate (touchCoordinates); 
      Console.WriteLine ("LAT: " + touchCoordinates.Latitude); 
      Console.WriteLine ("LON: " + touchCoordinates.Longitude); 

     } 
    } 

} 

}

+0

我認爲這已經解決了嗎? – 2016-09-01 22:08:49

回答

0

你可能想嘗試調用StartMonitoring,而不是前後設置你的事件處理程序。