Saya punya beberapa anotasi yang ingin saya tambahkan ke MKMapView saya (bisa 0-n item, di mana n umumnya sekitar 5). Saya dapat menambahkan anotasi dengan baik, tetapi saya ingin mengubah ukuran peta agar sesuai dengan semua anotasi di layar sekaligus, dan saya tidak yakin bagaimana melakukan ini.
Saya telah melihat -regionThatFits:
tetapi saya tidak yakin apa yang harus saya lakukan dengannya. Saya akan memposting beberapa kode untuk menunjukkan apa yang saya dapatkan sejauh ini. Saya pikir ini seharusnya menjadi tugas yang umumnya mudah tetapi sejauh ini saya merasa agak kewalahan dengan MapKit.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
//One location is obtained.. just zoom to that location
MKCoordinateRegion region;
region.center = location;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];
// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
[mapView addAnnotation:placemark];
ex = ex + 0.005;
}
// What do I do here?
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}
Perhatikan, ini semua terjadi saat saya menerima pembaruan lokasi ... Saya tidak tahu apakah itu tempat yang tepat untuk melakukan ini. Jika tidak, di manakah tempat yang lebih baik? -viewDidLoad
?
Terima kasih sebelumnya.
sumber
MKMapView
dan mengubah metode menjadi- (void) zoomToFitAnnotations:(BOOL)animated
. Bekerja dengan sempurna!Mengapa begitu rumit?
sumber
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
CLLocationCoordinate2D *coords
array? Menggunakanmalloc()
?r
yang pada dasarnya memperkecil 20 persenCGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
Saya telah melakukan sesuatu yang mirip dengan ini untuk memperkecil (atau masuk) ke area yang menyertakan anotasi titik dan lokasi saat ini. Anda dapat mengembangkannya dengan mengulang-ulang anotasi Anda.
Langkah dasarnya adalah:
sumber
MKCoordinateRegionMake
: gist.github.com/1599700 jika ada yang masih ingin melakukannya dengan cara ini.Saya punya jawaban yang berbeda. Saya akan menerapkan algoritma zoom-to-fit sendiri, tetapi saya pikir Apple harus memiliki cara untuk melakukan apa yang kami inginkan tanpa banyak pekerjaan. Menggunakan dokumen API dengan cepat menunjukkan bahwa saya dapat menggunakan MKPolygon untuk melakukan apa yang diperlukan:
Semoga ini membantu.
sumber
kamu juga bisa melakukannya dengan cara ini ..
sumber
Berdasarkan informasi dan saran dari semua orang yang saya temukan berikut ini. Terima kasih untuk semua orang dalam diskusi ini untuk kontribusinya :) Ini akan masuk ke dalam tampilan Controller yang berisi mapView.
sumber
Dalam kasus saya, saya mulai dengan objek CLLocation dan membuat anotasi untuk masing-masing objek.
Saya hanya perlu menempatkan dua anotasi, jadi saya memiliki pendekatan sederhana untuk membangun array poin, tetapi itu dapat dengan mudah diperluas untuk membangun array dengan panjang yang sewenang-wenang yang diberikan satu set CLLocations.
Inilah implementasi saya (tidak perlu membuat MKMapPoints):
sumber
Menggunakan Swift, poligon, dan beberapa padding tambahan, saya menggunakan yang berikut ini:
sumber
Ada metode baru di 'MKMapView' mulai iOS 7 yang dapat Anda gunakan
sumber
Saya tahu ini adalah pertanyaan lama tetapi, jika Anda ingin menampilkan semua anotasi SUDAH DI peta gunakan ini:
sumber
Berikut adalah Setara SWIFT (Dikonfirmasi Bekerja di: Xcode6.1, SDK 8.2) untuk Jawaban Mustafa:
sumber
Salah satu solusi yang mungkin adalah mengukur jarak antara lokasi saat ini dan semua anotasi dan menggunakan metode MKCoordinateRegionMakeWithDistance untuk membuat wilayah yang memiliki jarak sedikit lebih jauh daripada anotasi terjauh.
Hal ini tentu saja akan menjadi lebih lambat jika semakin banyak anotasi yang Anda tambahkan.
sumber
sumber
Berdasarkan jawaban luar biasa oleh
me2
(sekarang di Swift)sumber
Menambahkan sedikit klausa if untuk menangani 1 lokasi- untuk ditambahkan ke cuplikan kode cound mustufa. Fungsi zoomToAnnotation pkclSoft digunakan untuk itu:
sumber
kode ini berfungsi untuk saya, ini menunjukkan semua pin dengan lokasi saat ini, semoga ini membantu Anda,
sumber
Saya harap ini setidaknya relevan, inilah yang saya kumpulkan untuk Mono (berdasarkan jawaban pkclSoft):
sumber
sumber
Berdasarkan respons me2, saya menulis kategori untuk MKMapView untuk menambahkan beberapa margin dan melewati anotasi lokasi pengguna:
sumber
Karena saya tidak dapat mengomentari sebuah jawaban, saya ingin menambahkan sedikit kenyamanan saya ke dalam jawaban @ me2 (karena saya pikir itu adalah pendekatan yang paling elegan Ditemukan di sini).
Untuk proyek pribadi saya, saya hanya menambahkan kategori pada kelas MKMapView untuk merangkum fungsionalitas "area terlihat" untuk operasi umum: pengaturan untuk dapat melihat semua anotasi yang dimuat saat ini pada contoh MKMapView. hasilnya adalah ini:
file .h
file .m
Seperti yang Anda lihat, sejauh ini saya telah menambahkan 2 metode: satu untuk menyetel wilayah yang terlihat dari peta ke salah satu yang cocok dengan semua anotasi yang saat ini dimuat pada instance MKMapView, dan metode lain untuk menyetelnya ke berbagai objek. Jadi untuk mengatur wilayah mapView yang terlihat, kodenya akan sesederhana:
Saya harap ini membantu =)
sumber
Pertimbangkan ekstensi ini:
sumber
Versi 5 cepat:
sumber
Menambahkan tambahan pada jawaban Stéphane de Luca . Di sini kita dapat menyimpan UserLocation plus Anotasi Kustom agar sesuai dengan MKMapView
sumber