Какой у вас опыт работы с картами (MapKit/Google Maps) в iOS?

Ответ

Имею опыт интеграции и кастомизации картографических решений на iOS.

Основные задачи и технологии:

Задача Реализация (MapKit)
Отображение карты MKMapView, настройка региона (MKCoordinateRegion).
Работа с метками Кастомные MKAnnotationView, кластеризация (MKMarkerAnnotationView, iOS 11+).
Построение маршрутов MKDirections, отрисовка полилиний (MKPolylineRenderer).
Геокодирование CLGeocoder для преобразования адреса в координаты и обратно.
Трекинг пользователя CLLocationManager, MKUserTrackingButton.

Пример: Добавление кастомной аннотации и отображение региона.

import MapKit

// 1. Создание аннотации
let coordinate = CLLocationCoordinate2D(latitude: 55.751244, longitude: 37.618423)
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = "Москва"
annotation.subtitle = "Столица России"
mapView.addAnnotation(annotation)

// 2. Настройка отображаемого региона
let region = MKCoordinateRegion(
    center: coordinate,
    latitudinalMeters: 5000, // ~5 км по вертикали
    longitudinalMeters: 5000  // ~5 км по горизонтали
)
mapView.setRegion(region, animated: true)

// 3. (Опционально) Реализация делегата для кастомного вида аннотации
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard !annotation.isKind(of: MKUserLocation.self) else { return nil }
    let identifier = "CustomPin"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
    if annotationView == nil {
        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        annotationView?.canShowCallout = true
    } else {
        annotationView?.annotation = annotation
    }
    return annotationView
}

Также работал с Google Maps SDK, включая кастомные тайлы, Ground Overlays и оптимизацию производительности при отображении сотен маркеров.

Ответ 18+ 🔞

А, ну это я, блядь, знаю! Карты на iOS — это ж моя, сука, тема, как говаривал один мой знакомый, пока не утонул в озере с мешком. Шучу, шучу. Но реально, я с этой хуйнёй намучился, как Герасим с Муму, только без утопления.

Вот смотри, что я понаделал, пока не покрылся сединой и не начал материться на компилятор.

Что я там, блядь, крутил-вертел:

Что надо было сделать Как я это, сука, делал (MapKit)
Карту показать MKMapView, настроил регион (MKCoordinateRegion) — чтоб не в Китай сразу залететь.
Точечки тыкать Кастомные MKAnnotationView, кластеризация (MKMarkerAnnotationView, iOS 11+) — чтоб не превращалось всё в одно сплошное пятно, как совесть у алкоголика.
Дорожки рисовать MKDirections, рисовалка линий (MKPolylineRenderer).
Адрес в координаты CLGeocoder — превращал "ул. Пушкина, д. Колотушкина" в цифры, и наоборот.
За юзером следить CLLocationManager, MKUserTrackingButton — чтоб знал, где он, этот распиздяй, находится.

Вот, смотри, кусок кода, как я это обычно впендюривал:

import MapKit

// 1. Делаем точечку, блядь
let coordinate = CLLocationCoordinate2D(latitude: 55.751244, longitude: 37.618423)
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = "Москва"
annotation.subtitle = "Столица России"
mapView.addAnnotation(annotation)

// 2. Настраиваем, чтоб не всю планету показывало, а кусочек
let region = MKCoordinateRegion(
    center: coordinate,
    latitudinalMeters: 5000, // Ну, типа, 5 км вверх-вниз
    longitudinalMeters: 5000  // И столько же вширь
)
mapView.setRegion(region, animated: true)

// 3. А это, чтоб точечки красивые были, а не стандартные сопли
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    // Свою локацию не трогаем, пусть синим шариком болтается
    guard !annotation.isKind(of: MKUserLocation.self) else { return nil }
    let identifier = "CustomPin"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
    if annotationView == nil {
        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        annotationView?.canShowCallout = true // Чтоб по тапу тултип вылазил
    } else {
        annotationView?.annotation = annotation
    }
    return annotationView
}

А ещё, ёпта, я с Google Maps SDK воевал. Там, блядь, свои приколы: кастомные тайлы натягивал, эти Ground Overlays, и главное — когда маркеров овердохуища, а приложение должно летать, а не виснуть, как твой комп, когда ты десять вкладок Chrome открыл. Вот это была задача, я тебе скажу. Но справился, не без матерков, конечно.