Я использую MKMapView и добавил несколько аннотированных штифтов на карту около 5-10 километров. Когда я запускаю приложение, моя карта начинает уменьшаться, чтобы показать весь мир, как лучше всего увеличить карту так, чтобы контакты соответствовали виду?
РЕДАКТИРОВАТЬ: Первоначально я хотел бы использовать MKCoordinateRegionMake и рассчитать центр координат, longitudeDelta и latitudeDelta из моих аннотаций. Я почти уверен, что это сработает, но я просто хотел проверить, не упустил ли я ничего очевидного.
Код добавлен, кстати: FGLocation - это класс, которому соответствует MKAnnotation
, locationFake - один NSMutableArray
из этих объектов. Комментарии всегда приветствуются ....
- (MKCoordinateRegion)regionFromLocations {
CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];
// FIND LIMITS
for(FGLocation *eachLocation in locationFake) {
if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
}
// FIND REGION
MKCoordinateSpan locationSpan;
locationSpan.latitudeDelta = upper.latitude - lower.latitude;
locationSpan.longitudeDelta = upper.longitude - lower.longitude;
CLLocationCoordinate2D locationCenter;
locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
locationCenter.longitude = (upper.longitude + lower.longitude) / 2;
MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
return region;
}
ios
objective-c
iphone
cocoa-touch
mkmapview
fuzzygoat
источник
источник
Ответы:
Вы правильно поняли.
Найдите свои максимальные и минимальные широты и долготы, примените простую арифметику и используйте
MKCoordinateRegionMake
.Для прошивки 7 и выше, использование
showAnnotations:animated:
, изMKMapView.h
:источник
// Position the map such that the provided array of annotations are all visible to the fullest extent possible.
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
showAnnotations
также добавляет аннотации к карте, даже если аннотация для этого местоположения уже существует.removeAnnotations(_ annotations:)
сразу послеshowAnnotations(_ annotations:animated)
Это тот, который я нашел здесь который работал для меня:
(РЕДАКТИРОВАТЬ: я обновил решение, используя предложение @ Мики, чтобы увеличить pointRect на 0,1, чтобы убедиться, что прямоугольник не будет бесконечно малым!)
Вы также можете обновить это, чтобы включить вывод userLocation, заменив первую строку на:
источник
Apple добавила новый метод для IOS 7, чтобы немного упростить жизнь.
Вы можете легко извлечь из массива, сохраненного в виде карты:
и быстро настроить камеру тоже!
это не будет работать, если у пользователя не установлена iOS 7+ или OS X 10.9+. проверить пользовательскую анимацию здесь
источник
showAnnotations
это не так приближает масштабирование / подгонку аннотаций, как ручная реализация, поэтому я остановился на ручной.Я использую этот код и отлично работает для меня:
источник
В использовании Swift
В объективе c
источник
mapView.showAnnotations(mapView.annotations, animated: true)
Я преобразовал ответ Рафаэля Морейры. Кредит идет к нему. Для тех из вас, кто ищет версию Swift, вот код:
источник
Swift 3 Это правильный способ размещения всех аннотаций на карте.
источник
Решение @ Jowie прекрасно работает. Один улов: если на карте есть только одна аннотация, вы получите полностью уменьшенную карту. Я добавил 0.1 к размеру make прямоугольника, чтобы убедиться, что setVisibleMapRect может что-то увеличить.
источник
Если вы ищете iOS 8 и выше , самый простой способ сделать это - установить
var layoutMargins: UIEdgeInsets { get set }
вид карты перед вызовом.func showAnnotations(annotations: [MKAnnotation], animated: Bool)
Например (Swift 2.1):
источник
Я создал расширение, чтобы показать все аннотации с использованием некоторого кода здесь и там в быстром. Это не покажет все аннотации, если они не могут быть показаны даже при максимальном уровне масштабирования.
источник
UIEdgeInsetsMake
параметры, значения от 30 до 100 были хорошими для меня. Я тестировал с использованием iPhone SE i) S 10.2 Simulator. Пример кода:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Как примечание, этот код работает в Swift 3 и XCode 8.2.1.Добавлен этот цикл If в цикле for, чтобы исключить вывод местоположения пользователя из этого метода (требуется в моем случае и, возможно, в других)
источник
Для iOS 7 и выше (Ссылаясь на MKMapView.h):
замечание от - Абхишек Беди
Вы просто позвоните:
источник
В Свифте
источник
// Отредактировано для swift 5
источник
Благодаря Джоуи я обновил мою старую категорию до более элегантного решения. Совместное использование готового решения для копирования и вставки
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Надеюсь, это поможет кому-то, и еще раз спасибо, Джоуи!
источник
источник
Как отмечает Абхишек Беди в комментарии, для iOS7 forward лучший способ сделать это:
Для моего личного проекта (до iOS7) я просто добавил категорию в классе MKMapView, чтобы инкапсулировать функциональность «видимой области» для очень распространенной операции: настроить ее так, чтобы она могла видеть все загруженные в данный момент аннотации в экземпляре MKMapView ( это включает в себя столько пинов, сколько вы могли бы разместить, а также местоположение пользователя). результат был такой:
.h файл
.m файл
Как вы можете видеть, я добавил до сих пор 2 метода: один для установки видимой области карты на тот, который соответствует всем загруженным в данный момент аннотациям на экземпляре MKMapView, и другой метод для установки его на любой массив объектов. Таким образом, чтобы установить видимую область mapView, код будет таким простым:
Надеюсь это поможет =)
источник
Все ответы на этой странице предполагают, что карта занимает весь экран . На самом деле у меня есть HUD-дисплей (то есть кнопки, разбросанные сверху и снизу), которые дают информацию поверх карты ... и поэтому алгоритмы на странице будут правильно отображать контакты, но некоторые из них будут отображаться под кнопками отображения HUD. ,
Мое решение увеличивает масштаб карты, чтобы отобразить аннотации в подмножестве экрана и работает для экранов разных размеров (т. Е. 3,5 "против 4,0" и т. Д.):
Вот что я сделал в коде (примечание: я использую
NSConstraints
некоторые вспомогательные методы, чтобы заставить мой код работать на экранах разных размеров ... в то время как код вполне читабелен ... мой ответ здесь объясняет это лучше ... это в основном тот же рабочий процесс :)Вот код, который получает регион, который подходит:
источник
Я сделал небольшую модификацию кода Рафаэля для категории MKMapView.
источник
Основываясь на ответах выше, вы можете использовать универсальный метод для масштабирования карты, чтобы соответствовать всем аннотациям и наложениям одновременно.
А потом:
источник
Просто делюсь своими наблюдениями по этому поводу:
Если вы используете xCode> 6 с «выведенными» размерами для экранов (см. «Имитированные метрики» в Инспекторе файлов) в раскадровке, вызывая
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
Это
viewDidLoad
приведет к слишком большому уровню масштабирования на iPhone с 4 дюймами, поскольку макет карты по-прежнему соответствует размеру более широких экранов раскадровки.Вы можете переместить ваш звонок
showAnnotations...
наviewDidAppear
. Тогда размер карты уже настроен на меньший экран iPhone 4.Или же измените значение «выведено» в инспекторе файлов в разделе «смоделированные метрики» на 4-дюймовый iphone.
источник
Вы можете выбрать, какие фигуры вы хотите показать вместе с аннотациями.
источник
@ "Я не уверен, что это связано с некоторыми другими факторами в моей реализации, но я обнаружил, что showAnnotations не делает такое же близкое масштабирование / подгонку аннотаций, как ручная реализация, поэтому я застрял с ручной. - Тед Эйвери 17 апреля в 0:35 "
У меня была та же проблема, но затем я попытался сделать showAnnotations дважды (как показано ниже), и по какой-то причине это сработало.
[mapView showAnnotations: yourAnnotationArray animated: YES]; [mapView showAnnotations: yourAnnotationArray animated: YES];
источник
Совместимый с iOS 7 способ заключается в использовании следующего. Сначала позвоните
showAnnotation
, чтобы получить прямоугольник, включающий все аннотации. Затем создайте иUIEdgeInset
с верхней вставкой высоты штифта. Таким образом вы гарантированно отобразите весь значок на карте.источник
Поместите это в свой код соответственно:
источник