yandex / mapkit-ios-demo

MapKit iOS demo
Other
82 stars 25 forks source link

Сдвиг центра камеры #127

Closed maxprig closed 3 years ago

maxprig commented 3 years ago

Добрый день! Подскажите, пожалуйста, как сдвинуть центр камеры? В документации по андроиду нашел похожий пример со сдвигом focusRect, но на iOS это не работает.

mapView.mapWindow.focusRect = YMKScreenRect(topLeft: YMKScreenPoint(x: 0, y: 0), bottomRight: YMKScreenPoint(x: 300, y: 300))

eberkovich commented 3 years ago

Здравствуйте,

Уточните пожалуйста, что не работает и какой результат Вы хотите получить.

В результате указания focusRect, географическая точка в которую смотрим камера попадет в центр focusRect на экране. Это работает, только в случае если не было установлено свойство focusPoint, если оно задано, то камера будет позиционироваться в focusPoint. https://yandex.ru/dev/maps/mapkit/doc/ios-ref/full/Classes/YMKMapWindow.html#focusRect https://yandex.ru/dev/maps/mapkit/doc/ios-ref/full/Classes/YMKMapWindow.html#focusPoint

maxprig commented 3 years ago

Спасибо за то, что обратили внимание на мой вопрос!

Проблема в следующем: карта растянута на весь экран. Экран поделен на 3 части. Центр камеры должен находиться в центре блока 1 (условно). И если я вызову метод map.move, то камера должна встать (по заданным координатам, естественно) по центру блока 1.

Вот пример разметки экрана: https://disk.yandex.ru/i/5xr2oAaH51NyGg

Я пытаюсь сделать примерно следующим образом: ` import UIKit import YandexMapsMobile

class ViewController: UIViewController {

@IBOutlet weak var mapView: YMKMapView!

let TARGET_LOCATION = YMKPoint(latitude: 59.945933, longitude: 30.320045)

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    mapView.mapWindow.map.mapObjects.addPlacemark(with: TARGET_LOCATION, image: UIImage(named: "imaga")!)

}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    mapView.mapWindow.focusRect = .init(topLeft: .init(x: 0, y: 0),
                                        bottomRight: .init(x: Float(view.bounds.width), y: Float(view.bounds.height / 3)))

    mapView.mapWindow.map.move(
                with: YMKCameraPosition(target: TARGET_LOCATION, zoom: 15, azimuth: 0, tilt: 0),
                animationType: YMKAnimation(type: YMKAnimationType.smooth, duration: 5),
                cameraCallback: nil)
}

} ` Однако, камера центрируется прямо по центру экрана (центр блока 2 условно).

eberkovich commented 3 years ago

Видимо, после установки focusRect происходит изменение размеров view, в этом случае focusRect и focusPoint сбрасываются. Попробуйте пожалуйста выставлять focusRect в SizeChangedListener, добавить его можно с помощью: MapWindow.addSizeChangedListener.

На всякий случай, напоминаю, что mapkit хранит все листнеры по слабой ссылке, по этому их нужно сохранять на стороне приложения.

maxprig commented 3 years ago

Похоже, листенер помог. Большое Вам спасибо за помощь и хорошего дня!!))