ตำแหน่ง MKAnnotationView แบบกำหนดเองจะเปลี่ยนแปลงอย่างมากเมื่อหมุนหรือซูมเข้า/ออกแผนที่

ฉันมี MKAnnotationViews แบบกำหนดเองสองตัว ซึ่งแสดงผลได้ดีเมื่อเพิ่มลงใน MKMapView ในตอนแรก

ปัญหาคือเมื่อหมุนหรือซูมออก ตำแหน่งที่วาดไว้ดูเหมือนจะผิดเพี้ยนมากขึ้นเรื่อยๆ ขอย้ำอีกครั้งว่ายิ่งฉันซูมเข้าไปใกล้เท่าใด พวกมันก็จะยิ่งปรากฏได้แม่นยำมากขึ้นเท่านั้น แต่เมื่อซูมออกและหมุนพวกมันก็จะปิดสนิท มีความคิดอะไรบ้าง?

ดูดี (สถานะเริ่มต้น):

ภาพแรก

ดูไม่ดี (และผิด):

รูปภาพที่สอง

วิธีการ viewForAnnotation ของฉันค่อนข้างธรรมดา ไม่มีอะไรพิเศษเกิดขึ้นที่นี่

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
    }

อัปเดต

ฉันสงสัยว่าสิ่งนี้ค่อนข้างเกี่ยวข้องกับจุดยึด และฉันสามารถแก้ไขการหมุน "มุมมองคำอธิบายประกอบของหมุดจอดรถ" ได้ด้วย view.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0) แต่ไม่มีโชคกับมุมมองคำอธิบายประกอบของผู้ขับขี่ (ที่มีรถยนต์)

ขอบคุณสำหรับความช่วยเหลือ SO!


person royherma    schedule 04.07.2017    source แหล่งที่มา


คำตอบ (1)


คุณควรตั้งค่า centerOffset ของ MKAnnotationView ของคุณ ตามที่เอกสารบอกว่า:

ตามค่าเริ่มต้น จุดศูนย์กลางของมุมมองคำอธิบายประกอบจะถูกวางไว้ที่จุดพิกัดของคำอธิบายประกอบที่เกี่ยวข้อง คุณสามารถใช้คุณสมบัตินี้เพื่อเปลี่ยนตำแหน่งมุมมองคำอธิบายประกอบได้ตามต้องการ ค่าออฟเซ็ต x และ y นี้วัดเป็นจุด ค่าออฟเซ็ตที่เป็นบวกจะเลื่อนมุมมองคำอธิบายประกอบลงและไปทางขวา ในขณะที่ค่าลบจะเลื่อนขึ้นและไปทางซ้าย

person Rob    schedule 04.07.2017
comment
สำหรับมุมมองคำอธิบายประกอบของไดรเวอร์ ฉันเชื่อว่าจุดพิกัดควรเป็นจุดศูนย์กลางของมุมมอง เนื่องจากตำแหน่งภายในสี่เหลี่ยมจัตุรัสและขยายมุมมองทั้งหมด ดังนั้น การเปลี่ยนออฟเซ็ตกึ่งกลางจะช่วยได้อย่างไร สำหรับมุมมองคำอธิบายประกอบของพิน ฉันสามารถแก้ไขได้ด้วยการปรับจุดยึดที่กล่าวถึงในการอัปเดต - person royherma; 04.07.2017
comment
ฉันจะไม่เปลี่ยนจุดยึด นี่คือจุดประสงค์ของ centerOffset - person Rob; 04.07.2017
comment
ตกลง สมมติว่ามุมมองคำอธิบายประกอบไดรเวอร์ของฉันคือ 100 x 100 คะแนน คุณจะทำให้ centerOffset เป็น 0,50 หรือไม่ - person royherma; 04.07.2017
comment
0, -50 เพื่อเลื่อนขึ้น ผมเชื่อว่า - person Rob; 04.07.2017
comment
หน้ารถอยู่ด้านบน ดังนั้นลงข้างล่างจะดูสมเหตุสมผลกว่าไหม? - person royherma; 04.07.2017
comment
แน่นอน. ฉันกำลังมุ่งเน้นไปที่พิน ใช่ หากคุณต้องการเลื่อนรถลง คุณจะต้องใช้เลขบวก - person Rob; 04.07.2017
comment
ตามที่สงสัย วิธีนี้ไม่สามารถแก้ไขปัญหาได้ เพียงแต่ชดเชยกรอบการมองเห็นด้วย y - person royherma; 05.07.2017
comment
ใช่ การเปลี่ยนแปลง centerPoint จะส่งผลต่อตำแหน่งของมุมมองคำอธิบายประกอบในส่วนที่เกี่ยวกับ coordinate ของคำอธิบายประกอบ หากมุมมองคำอธิบายประกอบไม่ได้อยู่ตรงกลางอย่างเหมาะสม แต่ถ้าคุณเห็นการเปลี่ยนแปลงครั้งใหญ่ของ coordinate แสดงว่ามีอย่างอื่นเกิดขึ้นเช่นกัน ฉันสงสัยว่ามีบางอย่างเกิดขึ้นกับคำอธิบายประกอบนั้นเอง (เช่น คุณกำลังสร้างออบเจ็กต์คำอธิบายประกอบใหม่ทันทีในแต่ละครั้ง หรือคุณกำลังอ้างอิงถึงคุณสมบัติบางอย่างที่อาจกลายพันธุ์กับเรา) เราอาจจำเป็นต้องเห็นโค้ดคำอธิบายประกอบ เนื่องจากฉันไม่เห็นสิ่งผิดปกติอย่างชัดเจนในโค้ด viewFor - person Rob; 05.07.2017
comment
อย่างไรก็ตาม ฉันอาจแนะนำให้แสดงความคิดเห็นวิธีการ viewFor ทั้งหมด และใช้มุมมองคำอธิบายประกอบมาตรฐาน ซึ่งจะยืนยันว่าพฤติกรรมเป็นวิธีการนี้หรือสิ่งที่เกิดขึ้นกับคำอธิบายประกอบเอง - person Rob; 05.07.2017