問題
高德地圖的iOS SDK 3D版中(v2.4.0), 顯示范圍在560m左右時建築會呈現3D效果. 我們有沒有辦法可以限制地圖最小縮放到這個比例, 從而保證建築始終使用3D效果顯示呢?
探索
高德地圖的MAMapView再怎么封裝也是個UIView, 通過加斷點很容易看出它的結構
很明顯, 地圖上的操作都是依賴UIGestureRecognizer來處理的. 為了限制地圖的交互, 我們只需要想辦法修改一下這些gesture的處理邏輯即可.
對於pinch操作它提供了pinchGesture: 一個直接的想法是繼承並重寫這個方法, 但總是有些略繁瑣.
一個gesture是可以綁定多個處理方法的, 我們可以選擇一個更hack的方法. UIPinGestureRecognizer只有一個scale屬性是可讀寫的, 按理說地圖的縮放應該是直接根據這個屬性來調整的. 那么我們只要能夠讓這個值保持不變, 那就可以讓地圖也不再跟着縮放了. 結果證明這么做是沒問題的.
核心代碼如下:
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateBegan) { _lastPinchScale = recognizer.scale; } auto meter = [_map metersPerPointForCurrentZoomLevel]; if (recognizer.velocity < 0 && meter > MaxMeter) { _builtinPinch.scale = _lastPinchScale; } _lastPinchScale = _builtinPinch.scale; }
效果圖: