Lokasi MKAnnotationView khusus berubah drastis saat memutar atau memperbesar/memperkecil peta

Saya punya dua MKAnnotationViews khusus, yang ditampilkan dengan baik saat pertama kali ditambahkan ke MKMapView.

Masalahnya adalah, saat memutar, atau memperkecil, lokasi yang digambar tampak semakin menjauh. Sekali lagi, semakin dekat saya memperbesar, semakin akurat tampilannya, namun saat memperkecil dan memutar, tampilannya tidak aktif sama sekali. Ada ide?

Terlihat bagus (keadaan awal):

Gambar pertama

Terlihat buruk (dan salah):

Gambar kedua

Metode viewForAnnotation saya cukup mendasar, tidak ada hal mewah yang terjadi di sini.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {


        if let annotation = annotation as? PKDriverAnnotation
            {
            let identifier = "driver"
            var annotationView: PKDriverAnnotationView
            if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) { // 2
                dequeuedView.annotation = annotation
                annotationView = dequeuedView as! PKDriverAnnotationView
            } else {
                // 3
                annotationView = PKDriverAnnotationView(annotation: annotation, reuseIdentifier: identifier)
                annotationView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(PKTransactionMapViewController.annotationViewTapped(recognizer:))))
            }

            self.driverAnnotationView = annotationView

            return annotationView
        } else if let annotation = annotation as? PKAnnotation {
            let identifier = "pin"
            var view: MKAnnotationView
            if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) { // 2
                dequeuedView.annotation = annotation
                view = dequeuedView
            } else {
                // 3
                view = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
                view.image = UIImage(named: "TransactionAnnotation")
                view.canShowCallout = false
                view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(PKHomeViewController.annotationViewTapped(recognizer:))))

                let profilePic = FBSDKProfilePictureView(frame: CGRect(x: 4, y: 4, width: 43, height: 43))
                profilePic.center = CGPoint(x: view.bounds.midX, y: profilePic.center.y)
                profilePic.profileID = self.transaction!.availableParking.holder.fbid
                profilePic.layer.cornerRadius = 21.0
                profilePic.clipsToBounds = true
                view.addSubview(profilePic)
            }

            return view
        }
        return nil
    }

Memperbarui

Saya curiga ini ada hubungannya dengan titik jangkar, dan saya dapat memperbaiki rotasi "tampilan anotasi pin parkir" sebanyak view.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0), tetapi tidak berhasil dengan tampilan anotasi pengemudi (yang ada mobilnya)

Hargai bantuannya JADI!


person royherma    schedule 04.07.2017    source sumber


Jawaban (1)


Anda harus menyetel centerOffset dari MKAnnotationView Anda. Seperti yang dikatakan dalam dokumentasi:

Secara default, titik tengah tampilan anotasi ditempatkan pada titik koordinat anotasi terkait. Anda dapat menggunakan properti ini untuk mengubah posisi tampilan anotasi sesuai kebutuhan. Nilai offset x dan y ini diukur dalam poin. Nilai offset positif memindahkan tampilan anotasi ke bawah dan ke kanan, sedangkan nilai negatif memindahkannya ke atas dan ke kiri.

person Rob    schedule 04.07.2017
comment
Untuk tampilan anotasi pengemudi, saya yakin titik koordinat harus menjadi pusat tampilan, karena tempatnya di dalam persegi dan mencakup seluruh tampilan, jadi bagaimana cara mengubah offset tengah dapat membantu? Untuk tampilan anotasi pin, saya dapat menyelesaikannya dengan penyesuaian titik jangkar yang disebutkan dalam pembaruan. - person royherma; 04.07.2017
comment
Saya tidak akan mengubah titik jangkar. Ini adalah tujuan dari centerOffset. - person Rob; 04.07.2017
comment
Oke, jadi katakanlah tampilan anotasi driver saya adalah 100 x 100 poin, Anda akan membuat centerOffset 0,50? - person royherma; 04.07.2017
comment
0, -50 untuk menggesernya ke atas, saya yakin. - person Rob; 04.07.2017
comment
bagian depan mobil ada di atas jadi ke bawah sepertinya lebih masuk akal? - person royherma; 04.07.2017
comment
Tentu. Saya fokus pada pin. Yap, jika ingin menggerakkan mobil ke bawah, gunakan bilangan positif. - person Rob; 04.07.2017
comment
seperti yang diduga, ini tidak menyelesaikan masalah, hanya mengimbangi bingkai tampilan sebesar y. - person royherma; 05.07.2017
comment
Ya, perubahan centerPoint akan mempengaruhi lokasi tampilan anotasi sehubungan dengan coordinate anotasi, jika tampilan anotasi tidak berada di tengah dengan tepat. Namun jika Anda melihat perubahan radikal pada coordinate, berarti ada hal lain yang terjadi juga. Saya curiga ada sesuatu yang terjadi dengan anotasi itu sendiri (misalnya, apakah Anda membuat instance objek anotasi baru setiap kali? atau apakah Anda mereferensikan beberapa properti yang mungkin bermutasi pada kami?). Kita mungkin perlu melihat beberapa kode anotasi, karena saya tidak melihat ada yang salah dalam kode viewFor. - person Rob; 05.07.2017
comment
Ngomong-ngomong, saya mungkin menyarankan untuk mengomentari seluruh metode viewFor dan mengandalkan tampilan anotasi standar. Itu akan mengkonfirmasi apakah perilaku tersebut merupakan metode ini atau sesuatu yang terjadi dengan anotasi itu sendiri. - person Rob; 05.07.2017