Pertanyaan Bagaimana cara memindahkan MKAnnotation tanpa menambahkan / menghapusnya dari peta?


Mungkinkah memindahkan koordinat MKAnnotation tanpa menambah dan menghapus anotasi dari peta?


32
2018-02-13 01:44


asal


Jawaban:


Saya menemukan metode yang cukup sederhana. Saya ingin memperbarui posisi pemain saya dengan lancar tanpa menghapus dan kemudian menambahkan kembali anotasi pemain. Ini berfungsi dengan baik untuk aplikasi pra-iOS4, dan apa yang dilakukannya adalah memindahkan pin dan memusatkan peta di lokasi baru pin ini:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];

Berikut hal yang sama tetapi menggunakan fitur blok yang disarankan untuk iOS4:

[UIView animateWithDuration:0.5 animations:^{
    [player setCoordinate:aLoc.coordinate];
    [mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];

16
2017-07-05 13:47



Ini memang mungkin tanpa menghapus dan menambahkan anotasi off-course.

Anda harus mengamati koordinat MKAnnotation Anda dan memperbarui posisi MKAnnotationView ketika berubah. Atau Anda dapat (dan ini mungkin cara yang lebih elegan melakukannya) mendapatkan MKAnnotation dan MKAnnotationView Anda sendiri dan membuat mereka "bergerak".

Lihat Pindah-MKAnnotationView untuk contoh terperinci yang juga menjiwai posisi anotasi.


6
2018-03-14 15:19



Cukup gunakan KVO:

[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];

Jika MKAnnotation Anda memiliki metode setCoordinate, cukup sertakan baris-baris ini di sana:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    [self willChangeValueForKey:@"coordinate"];
    coordinate = newCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}

4
2018-03-13 18:30



Subclass MKPointAnnotation dan memiliki kemampuan untuk memperbarui tampilan anotasi di peta ke koordinat baru secara otomatis.


4
2018-04-26 19:17



Di Swift 4.0 dan iOS 11.0, saya hanya menambahkan atribut dinamis ke properti koordinat kelas turunan kelas MKAnnotation dan berfungsi: Semua Anotasi di MapView memperbarui lokasinya jika koordinat nilai objek MKAnnotation diperbarui:

class CarAnnotation: NSObject, MKAnnotation {
    @objc dynamic var coordinate: CLLocationCoordinate2D
    //Add your custom code here
}

3
2018-03-15 09:30



Tidak tahu apakah itu lebih umum mungkin, tetapi itu adalah jika Anda memiliki MKAnnotationView kustom Anda sendiri.

Saya mampu menyesuaikan pendekatan yang didokumentasikan di http://spitzkoff.com/craig/?p=108 oleh Craig Spitzkoff:

  1. Berikan MKAnnotationView khusus Anda referensi ke objek MKAnnotation Anda
  2. Tambahkan metode updateCoordinates ke objek dan panggilan MKAnnotation ketika Anda ingin mengubah lokasi dari anotasi
  3. Panggil wilayah Diubah pada kebiasaan MKAnnotationView untuk membiarkannya tahu kapan untuk memposisikan ulang dirinya (mis. kapan MKAnnotation telah diperbarui koordinat)
  4. Di drawRect pada objek pandangan internal yang dimiliki oleh Anda MKAnnotationView kustom Anda bisa reposisi menggunakan koordinat the MKAnnotation (Anda memegang file referensi untuk itu).

Anda mungkin bisa menyederhanakan pendekatan ini lebih lanjut - Anda mungkin tidak memerlukan objek pandangan internal dalam semua keadaan.


2
2018-02-15 03:45



Jika Anda menyimpan referensi ke anotasi Anda, buat perubahan pada properti koordinat, kemudian tambahkan anotasi ke peta lagi, lokasi tampilan anotasi akan diperbarui. Anda tidak perlu menghapus anotasi (yang akan menyebabkan tampilan anotasi menghilang sejenak). Ini tidak akan memberi Anda transisi yang bagus ketika koordinat anotasi diperbarui. Ini juga tidak menghasilkan kebocoran memori atau ada kelipatan dari anotasi yang sama ditambahkan ke peta (jika Anda melihat jumlah anotasi pada tampilan peta, itu tetap konstan ketika Anda menambahkan anotasi).


1
2018-02-16 13:58