Пользовательское местоположение 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), но мне не повезло с видом аннотаций водителя (тот, который с автомобилем)

Благодарю за помощь ТАК!


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