2016-03-01 38 views
2

我正在評估從MapKit切換到Mapbox。Mapbox中的MKUserTrackingBarButtonItem

我已經找到所有函數的等價物,除了MKUserTrackingBarButtonItem

let trackingButton = MKUserTrackingBarButtonItem(mapView: map) 

有沒有辦法爲Mapbox iOS SDK創建這個按鈕?

我還沒有在Mapbox文檔中發現任何類似內容,我無法繼續使用此功能,因爲它需要MKMapView

在此先感謝。

回答

2

有相當於MKUserTrackingBarButtonItemdoesn’t yet exist在Mapbox的iOS SDK(如V3.1),但有一個基本的實現in the project’s demo app

- (void)viewDidLoad 
{ 
    ... 

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
     initWithImage:[UIImage imageNamed:@"TrackingLocationOffMask.png"] 
     style:UIBarButtonItemStylePlain 
     target:self 
     action:@selector(locateUser)]; 
} 

- (void)locateUser 
{ 
    MGLUserTrackingMode nextMode; 
    switch (self.mapView.userTrackingMode) { 
     case MGLUserTrackingModeNone: 
      nextMode = MGLUserTrackingModeFollow; 
      break; 
     case MGLUserTrackingModeFollow: 
      nextMode = MGLUserTrackingModeFollowWithHeading; 
      break; 
     case MGLUserTrackingModeFollowWithHeading: 
      nextMode = MGLUserTrackingModeFollowWithCourse; 
      break; 
     case MGLUserTrackingModeFollowWithCourse: 
      nextMode = MGLUserTrackingModeNone; 
      break; 
    } 
    self.mapView.userTrackingMode = nextMode; 
} 

- (void)mapView:(__unused MGLMapView *)mapView didChangeUserTrackingMode:(MGLUserTrackingMode)mode animated:(__unused BOOL)animated 
{ 
    UIImage *newButtonImage; 
    NSString *newButtonTitle; 

    switch (mode) { 
     case MGLUserTrackingModeNone: 
      newButtonImage = [UIImage imageNamed:@"TrackingLocationOffMask.png"]; 
      break; 

     case MGLUserTrackingModeFollow: 
      newButtonImage = [UIImage imageNamed:@"TrackingLocationMask.png"]; 
      break; 

     case MGLUserTrackingModeFollowWithHeading: 
      newButtonImage = [UIImage imageNamed:@"TrackingHeadingMask.png"]; 
      break; 
     case MGLUserTrackingModeFollowWithCourse: 
      newButtonImage = nil; 
      newButtonTitle = @"Course"; 
      break; 
    } 

    self.navigationItem.rightBarButtonItem.title = newButtonTitle; 
    [UIView animateWithDuration:0.25 animations:^{ 
     self.navigationItem.rightBarButtonItem.image = newButtonImage; 
    }]; 
} 
+0

謝謝,這將工作。儘管它與MapKit中的一行相比有很多代碼。你知道是否有計劃在SDK中添加一個等價物? – dersvenhesse

+0

是的,這是[我們將添加](https://github.com/mapbox/mapbox-gl-native/issues/1093)。 – friedbunny

2

萬一別人有興趣,這裏是這個this answer翻譯Swift在簡單的ViewController。我只是遺漏了.FollowWithCourse來複制MKUserTrackingBarButtonItem的行爲。

class ViewController: UIViewController, MGLMapViewDelegate { 

    @IBOutlet weak var map: MGLMapView! 
    @IBOutlet weak var toolbar: UIToolbar! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     map.delegate = self 

     map.setCenterCoordinate(CLLocationCoordinate2D(latitude: 40.7326808, longitude: -73.9843407), zoomLevel: 12, animated: false) 

     let trackingButton = UIBarButtonItem(image: UIImage(named: "TrackingLocationOffMask"), style: UIBarButtonItemStyle.Plain, target: self, action: "trackingButtonChanged") 
     toolbar.items!.insert(trackingButton, atIndex: 0) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func mapView(mapView: MGLMapView, didChangeUserTrackingMode mode: MGLUserTrackingMode, animated: Bool) { 
     var image: String = "TrackingLocationOffMask.png" 

     switch (mode) { 
     case .Follow: 
      image = "TrackingLocationMask.png" 
      break 
     case .FollowWithHeading: 
      image = "TrackingHeadingMask.png" 
      break 
     default: 
      break 
     } 

     UIView.animateWithDuration(0.25, animations: { 
      (self.toolbar.items![0] as UIBarButtonItem).image = UIImage(named: image) 
     }) 
    } 

    func trackingButtonChanged() { 
     var mode: MGLUserTrackingMode = .Follow 

     switch (map.userTrackingMode) { 
     case .Follow: 
      mode = .FollowWithHeading 
      break 
     case .FollowWithHeading: 
      mode = .None 
      break 
     default: 
      break 
     } 

     map.userTrackingMode = mode 
    } 
} 

的圖像是在here在GitHub上mapbox-GL-本地。