Mapbox iOS setVisibleCoordinates работает не так, как ожидалось

#ios #mapbox #mapbox-gl

#iOS #mapbox #mapbox-gl

Вопрос:

У меня возникли некоторые проблемы с отображением фиксированной карты Ирландии с помощью Mapbox в ios на разных размерах экрана. Похоже, что MGLMapView.setVisibleCoordinates — это то, что мне нужно, но он ведет себя не так, как я ожидал. Я ожидаю передать нижнюю левую координату и верхнюю правую координату и определить прямоугольник для отображения независимо от размера экрана.

mapView.setVisibleCoordinates([CLLocationCoordinate2D(latitude: 50.347676, longitude: -11.444362), CLLocationCoordinate2D(latitude: 56.375322, longitude: -4.128659)], count: 2, edgePadding: UIEdgeInsets.zero, animated: false)

Я также пробовал

mapView.setVisibleCoordinateBounds(MGLCoordinateBounds(sw: CLLocationCoordinate2D(latitude: 50.347676, longitude: -11.444362), ne: CLLocationCoordinate2D(latitude: 56.375322, longitude: -4.128659)), edgePadding: UIEdgeInsets.zero, animated: false)

К тем же результатам, что и показано ниже. Как вы можете видеть, макет iphone 5s идеален, но я ожидаю, что приведенный выше код покажет тот же вид на ipad, однако он слишком сильно уменьшен. Как я могу показать один и тот же вид на разных устройствах?

iPad

Iphone 5s

Ответ №1:

Хорошо, у меня это получилось. В MGLMapView есть метод camera, который возвращает камеру, которая увеличивает масштаб настолько, насколько это возможно, при этом все еще отображая указанный вами прямоугольник. Просто нужно убедиться, что это сделано в didFinishLoading методе делегирования.

 let northeast = CLLocationCoordinate2D(latitude: 55.499130, longitude: -5.945938)
let southwest = CLLocationCoordinate2D(latitude: 51.133369, longitude: -10.531064)

let ireland = MGLCoordinateBounds(sw: southwest, ne: northeast)

let camera = mapView.camera(mapView.camera, fitting: ireland, edgePadding: UIEdgeInsets.zero)

mapView.setCamera(camera, animated: false)
  

Комментарии:

1. Это хорошее решение.

Ответ №2:

На веб-сайте Mapbox есть пример, который делает именно то (я думаю), что вы хотите. Я взял на себя смелость вставить ваши координаты и т.д., Как показано ниже. Ссылки прерываются, поэтому я опубликую код.

РЕДАКТИРОВАТЬ: изменено, чтобы запретить прокрутку, панорамирование и масштабирование.

 import Mapbox

class ViewController: UIViewController, MGLMapViewDelegate {

    private var ireland: MGLCoordinateBounds!

    override func viewDidLoad() {
        super.viewDidLoad()

        let mapView = MGLMapView(frame: view.bounds)
        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        mapView.delegate = self


        let northeast = CLLocationCoordinate2D(latitude: 56.375322, longitude: -4.128659)
        let southwest = CLLocationCoordinate2D(latitude: 50.347676, longitude: -11.444362)

        var box = [northeast, southwest]
        mapView.setVisibleCoordinates(amp;box, count: 2, edgePadding: UIEdgeInsets.init(top: 20.0, left: 20.0, bottom: 20.0, right: 20.0), animated: false)
        mapView.isScrollEnabled = false
        mapView.allowsZooming = false

        view.addSubview(mapView)
    }
}
  

Комментарии:

1. Это не совсем работает, но я понимаю теорию. ipad по-прежнему слишком уменьшен, а iphone увеличен слишком сильно. Не могли бы вы поделиться ссылкой, по которой вы ее получили, в комментарии?

2. Я думаю, вы поняли это из руководства «Ограничить панорамирование карты областью». Моя карта вообще не является подвижной или масштабируемой, поэтому она должна быть просто фиксированным видом, показывающим Ирландию. Я все еще в поиске…

3. Ах, ладно, я неправильно понял. Если вам просто нужен статический вид Ирландии — без прокрутки, без масштабирования, это должен быть просто случай настройки вида и соответствующих свойств. Я исправлю свой ответ. РЕДАКТИРОВАТЬ: Только что проверил в тестовом приложении, и у меня оно работает как на iPad, так и на iPhone.

Ответ №3:

Это помогает мне увеличить определенную область в Mapbox

 self.mapView.centerCoordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
self.mapView.zoomLevel = 13
self.mapView.centerCoordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
self.mapView.setCenter(CLLocationCoordinate2D(latitude: lat, longitude: long, animated: true)