2016-06-22 59 views
2

我正在使用mapbox-iOS-SDK 3.2.3,無法找到任何屬性或像這樣控制地圖邊界。我需要限制用戶的可見區域。目前的SDK版本有可能嗎?如何限制mapbox MGLMapView中的地圖邊界?

+0

我不知道我明白你想要做什麼。 –

+0

我想爲地圖設置邊界,例如只顯示一個城市。因此用戶可以縮放,平移和使用此地圖進行常規操作,但只能在有限的區域內進行。 – ShurupuS

+0

Mapbox似乎現在有一個內置的解決方案:https://www.mapbox.com/ios-sdk/examples/constraining-gestures/ – Stonetip

回答

3

沒有什麼內置於當前版本Mapbox的,看起來像它會做你想要什麼。您可能能夠通過

  1. 在地圖視圖委託實施mapViewRegionIsChanging:mapView:regionDidChangeAnimated:
  2. 在這些方法中得到類似的東西,檢查當前區域。如果超出了所需區域,請將地圖視圖重置爲所需區域內的某個區域。也就是說,只要地圖視圖開始移動到區域之外,就讓它返回。

這可能會工作,但如果用戶試圖向目標區域外的滾動它可能使視圖「口吃」。我不知道你的應用是做什麼的,但是可能值得考慮(a)這是否真的有必要,以及(b)是否有更好的方法來避免你期望的任何問題,而不是限制地圖視圖滾動。

+0

好了,因爲我看到的,問題是更廣泛和完全一樣的MapKit 。好吧,我會嘗試使用委託方法來解決這個問題。不幸的是,這是我們客戶對地圖框架的主要要求之一。謝謝你的幫助! – ShurupuS

+1

這是一個開源的框架,所以你總是可以考慮添加你自己的委託方法(也許增加一個'shouldMapViewRegionChange'方法)或其他手段來獲得你想要的。 –

2

我把這個想法從@Tom Harrington,並多觀察,多口吃或動畫jankiness如何同時保持約束已知Mapbox內的用戶有目標實現的委託。我提出了他的答案,但也想分享這個例子。

這裏是一個斯威夫特代表,填補了對mapViewRegionIsChanging

  • 委託的主要目的是測試經驗仍然是令人高興的客戶(是)
  • 可以委託妥善保管用戶在不經常調用委託的範圍內? (仍有待驗證)
  • 用途Balboa公園,正方形Mapbox只有MGLCoordinateBounds
  • 檢查客戶滾動太遠
  • 概念太遠是由一些寬容檢查,epsilon
  • 檢查出界四面應該直截了當

    func mapViewRegionIsChanging (mapView: MGLMapView) { 
    
        let viewBounds = mapView.visibleCoordinateBounds 
    
        // Set the map's bounds to Balboa Park, San Diego 
        let boundsBalboaPark = MGLCoordinateBounds(
        sw: CLLocationCoordinate2D(latitude: 32.71942, longitude: -117.15914), 
        ne: CLLocationCoordinate2D(latitude: 32.74093, longitude: -117.13374)) 
    
        let deltaNorth = viewBounds.ne.latitude - boundsBalboaPark.ne.latitude 
    
        let epsilon = 0.025 // Magic number for tolerance of how far 'north' we allow (in degrees); Q.E.D meters 
        if(deltaNorth > epsilon) { 
        mapView.setVisibleCoordinateBounds(boundsBalboaPark, animated: true) 
        } 
    } 
    

此動畫顯示移動的MapView太遠北巴爾博亞公園的。你看到的口吃是真實的,但可以接受。

enter image description here

+0

我建議不要跳回到原來的中心位置,而要跳回到原來的範圍內。這將顯着減少跳躍。 –

+0

我同意。另一個好主意是讓觀看者的最小變焦動畫,這樣客戶就可以獲得重新定位自己的體驗。 – RobLabs