Saya menggunakan MKMapView dan telah menambahkan sejumlah pin anotasi ke peta sekitar 5-10 kilometer. Ketika saya menjalankan aplikasi, peta saya mulai diperbesar untuk menunjukkan seluruh dunia, apa cara terbaik untuk memperbesar peta sehingga pin sesuai dengan tampilan?
EDIT: Pemikiran awal saya adalah menggunakan MKCoordinateRegionMake dan menghitung pusat koordinat, bujurDelta, dan latitudeDelta dari anotasi saya. Saya cukup yakin ini akan berhasil, tetapi saya hanya ingin memeriksa bahwa saya tidak melewatkan sesuatu yang jelas.
Kode ditambahkan, BTW: FGLocation adalah kelas yang sesuai dengan MKAnnotation
, locationFake adalah salah satu NSMutableArray
dari objek-objek ini. Komentar selalu diterima ....
- (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
sumber
sumber
Jawaban:
Anda benar.
Temukan garis lintang dan bujur maksimum dan minimum Anda, terapkan beberapa aritmatika sederhana, dan gunakan
MKCoordinateRegionMake
.Untuk iOS 7 dan di atasnya, gunakan
showAnnotations:animated:
, dariMKMapView.h
:sumber
// 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
juga menambahkan anotasi ke peta, bahkan jika anotasi untuk lokasi itu sudah ada.removeAnnotations(_ annotations:)
segera setelahshowAnnotations(_ annotations:animated)
Ini yang saya temukan di sini yang bekerja untuk saya:
(EDIT: Saya telah memperbarui solusi menggunakan saran @ Micah untuk meningkatkan pointRect sebesar 0,1 untuk memastikan persegi tidak berakhir menjadi sangat kecil!)
Anda juga dapat memperbarui ini untuk memasukkan pin userLocation dengan mengganti baris pertama dengan:
sumber
Apple telah menambahkan metode baru untuk iOS 7 untuk menyederhanakan hidup sedikit.
Anda dapat dengan mudah menarik dari array yang tersimpan di tampilan peta:
dan sesuaikan kamera dengan cepat juga!
ini tidak akan berfungsi kecuali pengguna menginstal iOS 7+ atau OS X 10.9+. lihat animasi khusus di sini
sumber
showAnnotations
itu tidak melakukan zoom / fit anotasi seperti halnya implementasi manual, jadi saya terjebak dengan yang manual.Saya menggunakan kode ini dan berfungsi dengan baik untuk saya:
sumber
Sedang digunakan Swift
Dalam Tujuan c
sumber
mapView.showAnnotations(mapView.annotations, animated: true)
Saya telah mengonversi jawaban oleh Rafael Moreira. Penghargaan itu jatuh padanya. Bagi Anda yang mencari versi Swift, berikut ini kodenya:
sumber
Swift 3 Ini adalah cara yang benar untuk memuat semua anotasi di peta.
sumber
Solusi @ jowie bekerja sangat baik. Satu tangkapan, jika peta hanya memiliki satu anotasi, Anda akan berakhir dengan peta yang diperbesar sepenuhnya. Saya menambahkan 0,1 ke ukuran make rect untuk memastikan setVisibleMapRect memiliki sesuatu untuk diperbesar.
sumber
Jika Anda mencari iOS 8 ke atas , cara paling sederhana untuk melakukannya adalah dengan mengatur
var layoutMargins: UIEdgeInsets { get set }
tampilan peta Anda sebelum meneleponfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Misalnya (Swift 2.1):
sumber
Saya membuat ekstensi untuk menunjukkan semua anotasi menggunakan beberapa kode dari sana-sini dengan cepat. Ini tidak akan menampilkan semua anotasi jika mereka tidak dapat ditampilkan bahkan pada tingkat zoom maksimum.
sumber
UIEdgeInsetsMake
parameter, nilai antara 30 dan 100 bagus untuk saya. Saya sedang menguji menggunakan iPhone SE i) S 10.2 Simulator. Contoh kode:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Sebagai catatan, Kode Ini Berfungsi di Swift 3 dan XCode 8.2.1.Menambahkan loop If ini dalam for loop untuk mengecualikan pin lokasi pengguna dari metode ini (diperlukan dalam kasus saya, dan mungkin yang lain)
sumber
Untuk iOS 7 dan yang lebih baru (Merujuk MKMapView.h):
komentar dari - Abhishek Bedi
Anda baru saja menelepon:
sumber
Dalam Swift
sumber
// Diedit untuk cepat 5
sumber
Berkat jowie saya telah memperbarui kategori lama saya ke solusi yang lebih elegan. Berbagi solusi lengkap, hampir salin & tempel
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Semoga ini bisa membantu seseorang dan terima kasih lagi jowie!
sumber
sumber
Seperti yang ditunjukkan Abhishek Bedi dalam komentar, Untuk iOS7, cara terbaik untuk melakukan ini adalah:
Untuk proyek pribadi saya (sebelum iOS7) saya cukup menambahkan kategori pada kelas MKMapView untuk merangkum fungsionalitas "area tampak" untuk operasi yang sangat umum: mengaturnya agar dapat melihat semua anotasi yang saat ini dimuat pada instance MKMapView ( ini termasuk pin sebanyak yang mungkin Anda tempatkan, serta lokasi pengguna). hasilnya adalah ini:
file .h
file .m
Seperti yang Anda lihat, saya telah menambahkan 2 metode sejauh ini: satu untuk mengatur wilayah peta yang terlihat ke yang cocok dengan semua anotasi yang dimuat saat ini pada instance MKMapView, dan metode lain untuk mengaturnya ke berbagai objek. Jadi untuk mengatur wilayah yang terlihat dari mapView maka kode akan sesederhana:
Saya harap ini membantu =)
sumber
Semua jawaban di halaman ini mengasumsikan bahwa peta tersebut menempati layar penuh . Saya sebenarnya memiliki tampilan HUD (yaitu tombol yang tersebar di bagian atas dan bawah) yang memberikan informasi di atas peta .. dan algoritma pada halaman akan menampilkan pin dengan benar, tetapi beberapa di antaranya akan muncul di bawah tombol tampilan HUD .
Solusi saya memperbesar peta untuk menampilkan anotasi dalam subset layar dan berfungsi untuk berbagai ukuran layar (mis. 3,5 "vs 4,0" dll):
Berikut adalah apa yang saya lakukan dalam kode (catatan: saya gunakan
NSConstraints
dengan beberapa metode pembantu untuk membuat kode saya bekerja dalam ukuran layar yang berbeda .. sementara kode ini cukup mudah dibaca .. jawaban saya di sini menjelaskan lebih baik .. itu pada dasarnya alur kerja yang sama :)di sini adalah kode yang mendapat wilayah yang cocok:
sumber
Saya telah membuat sedikit modifikasi kode Rafael untuk Kategori MKMapView.
sumber
Berdasarkan jawaban di atas Anda dapat menggunakan metode universal untuk memperbesar peta agar sesuai dengan semua anotasi dan overlay pada saat yang bersamaan.
Lalu:
sumber
Cukup bagikan pengamatan saya tentang ini:
Jika Anda menggunakan xCode> 6 dengan ukuran "disimpulkan" untuk layar (lihat "metrik simulasi" pada inspektur file) di storyboard, menelepon
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
in
viewDidLoad
akan menghasilkan tingkat zoom terlalu besar pada iPhone dengan 4 inci karena tata letak untuk peta masih pada ukuran layar yang lebih luas dari storyboard.Anda dapat memindahkan panggilan
showAnnotations...
keviewDidAppear
. Kemudian ukuran peta telah disesuaikan dengan layar iPhone 4 yang lebih kecil.Atau sebagai alternatif ubah nilai "disimpulkan" di inspektur file di bawah "metrik simulasi" menjadi iphone 4-inci.
sumber
Anda dapat memilih bentuk mana yang ingin Anda tampilkan bersama dengan Anotasi.
sumber
@ "Saya tidak yakin apakah ini karena beberapa faktor lain dalam implementasi saya, tetapi saya menemukan bahwa showAnnotations tidak melakukan zoom / fit dari anotasi seperti halnya implementasi manual, jadi saya terjebak dengan manual satu -. Ted Avery 17 Apr jam 0:35 "
Saya memiliki masalah yang sama, tetapi kemudian saya mencoba melakukan showAnnotations dua kali (seperti di bawah), dan untuk beberapa alasan, itu berhasil.
[mapView showAnnotations: yourAnnotationArray animated: YES]; [mapView showAnnotations: yourAnnotationArray animated: YES];
sumber
Cara yang kompatibel dengan iOS 7 adalah menggunakan yang berikut ini. Panggilan pertama
showAnnotation
untuk mendapatkan persegi panjang termasuk semua penjelasan. Setelah itu buat danUIEdgeInset
dengan inset tinggi pin. Dengan demikian, Anda memastikan untuk menampilkan seluruh pin pada peta.sumber
Masukkan ini ke kode Anda sesuai:
sumber