Если маркеров будет много, я не рекомендую использовать iconView, потому что это делает пользовательский интерфейс медленным, но вот оно:
Создайте файл UIView как «MarkerInfoView», который будет создан как MarkerInfoView.xib
.
Затем создайте свой пользовательский интерфейс, добавьте изображение для своего значка, а затем добавьте другие необходимые представления для завершения вашего iconView. Также включите маркер в дизайн как imageView. Потому что я не уверен на 100%, но я думаю, что вы не можете использовать и iconView, и значок на картах Google.
Затем создайте быстрый файл с именем «MarkerInfoView.swift», перейдите к MarkerInfoView.xib
и выберите его класс как MarkerInfoView
.
Затем создайте еще один быстрый файл, назовите его PlaceMarker
, внутри этого файла вы создадите класс, который будет соответствовать GMSMarker, затем вы инициализируете свое представление, чтобы установить его равным iconView
в классе PlaceMarker
. Сделаем это следующим образом:
class PlaceMarker: GMSMarker {
//Initialize with lat and long, then set position equal to the coordinate.
// 'position' comes from inheriting from GMSMarker, which is google marker.
init(latitude: Double, longitude: Double, distance: Double, placeName: String) {
super.init()
if let lat: CLLocationDegrees = latitude,
let long: CLLocationDegrees = longitude {
let coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
position = coordinate
}
let view = Bundle.main.loadNibNamed("MarkerInfoView", owner: nil, options: nil)?.first as! MarkerInfoView
// you can set your view's properties here with data you are sending in initializer.
// Remember if you need to pass more than just latitude and longitude, you need
// to update initializer.
// lets say you created 2 outlet as placeNameLabel, and distanceLabel, you can set
// them like following:
view.placeNameLabel.text = placeName
view.distanceLabel.text = distance
// Once your view is ready set iconView property coming from inheriting to
// your view as following:
iconView = view
appearAnimation = .pop //not necessarily but looks nice.
}
}
Затем, когда у вас есть данные и просмотр карт Google на ViewController
, вы можете установить это так:
let latitude = 101.432432 //arbitrary, should come from your source
let longitude = 34.432124
let distance = 4
let placeName = "My place".
let marker = PlaceMarker(latitude: latitude, longitude: longitude, distance: distance, placeName: placeName)
marker.map = self.mapView // your google maps set your marker's map to it.
Спасибо @Hemang, пожалуйста, не стесняйтесь редактировать ответ, если хотите, чтобы он мог предоставить лучшее решение для других в будущем.
iconView
меняет свое положение, и мы должны установитьgroundAnchor
, чтобы убедиться, что он будет в точном положении в качестве маркера по умолчанию.