Ответ
MapKit предлагает несколько API для управления областью отображения карты, каждый из которых подходит для разных сценариев.
1. Установка региона (Region)
Метод setRegion(_:animated:) задает центр карты и уровень приближения через MKCoordinateSpan.
import MapKit
let moscowCoordinate = CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6176)
// latitudeDelta и longitudeDelta определяют "высоту" и "ширину" видимой области в градусах.
// Меньшие значения = большее приближение (зум).
let span = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
let region = MKCoordinateRegion(center: moscowCoordinate, span: span)
mapView.setRegion(region, animated: true)
Когда использовать: Для перехода к конкретной географической области с заданным уровнем детализации.
2. Установка камеры (Camera)
Класс MKMapCamera предоставляет расширенный контроль, включая 3D-вид.
let center = CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6176)
// Создаем камеру, "смотрящую" на центр с высоты 1000 метров,
// под углом 45 градусов и направленную на восток (heading = 90).
let camera = MKMapCamera(
lookingAtCenter: center,
fromDistance: 1000, // Высота в метрах
pitch: 45, // Угол наклона (0 = вид сверху, 90 = вид сбоку)
heading: 90 // Азимут (0 = север, 90 = восток)
)
mapView.setCamera(camera, animated: true)
Когда использовать: Для создания 3D-эффектов, контроля точной высоты обзора или угла наклона.
3. Отображение аннотаций и оверлеев
Методы showAnnotations(_:animated:) и setVisibleMapRect(_:animated:) автоматически подбирают регион.
// Автоматически подобрать регион, чтобы были видны все аннотации
let annotations = [annotation1, annotation2, annotation3]
mapView.showAnnotations(annotations, animated: true)
// Или задать видимую область через MKMapRect (координаты в системе карты)
let mapRect = MKMapRect(...)
mapView.setVisibleMapRect(mapRect, edgePadding: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20), animated: true)
Когда использовать: Для удобного отображения группы точек интереса или графических наложений (overlays).
4. Прямое управление уровнем масштаба
- Пользовательский зум: Свойства
isZoomEnabledиisScrollEnabledразрешают или запрещают жесты масштабирования и прокрутки. - Минимальный/максимальный зум: Можно ограничить через
cameraZoomRange(iOS 13+).let zoomRange = MKMapView.CameraZoomRange(minCenterCoordinateDistance: 500, maxCenterCoordinateDistance: 10000) mapView.setCameraZoomRange(zoomRange, animated: false)
Ключевые различия и рекомендации:
RegionvsCamera: Установкаregionможет изменить текущие значенияcamera(например, сбросить угол наклона). Для полного контроля, особенно в 3D-режиме, используйтеcamera.- Производительность: Частые анимированные изменения региона или камеры могут нагружать производительность. Используйте флаг
animated: falseпри начальной настройке. - Координатные системы:
Regionработает с географическими координатами (градусы),Camera.distance— в метрах, аMKMapRect— во внутренних единицах карты.