Положение пользователя MKAnnotationView показывает порядок отображения относительно других аннотаций в iOS 10, 11, 12 - PullRequest
0 голосов
/ 08 января 2019

Как установить местоположение пользователя по умолчанию для размещения перед другими аннотациями.

Для iOS 10 layer.zPoation отлично работает на любой аннотации. В iOS 11 Apple изменила что-то, и layer.zPosition больше не работает, потому что MKMapView автоматически изменяет zPosition. Я знаю, что могу использовать пользовательский CALayer с фиксированным zPosition и хитрым сеттером, который ничего не делает только в iOS 11, но как я могу контролировать zPosition стандартной пользовательской аннотации местоположения, также известной как MKUserLocation

Вот код, который у меня есть. Это работает в iOS 10 и 11 для пользовательских представлений аннотации, но я не могу понять, как управлять представлением аннотации местоположения пользователя (эта синяя точка по умолчанию с областью круга с радиусом точности).

class FixedZPositionLayer: CALayer {

    override var zPosition: CGFloat {
        get { return super.zPosition }
        set {
            if #available(iOS 11, *) {
                // do nothing on iOS 11 and later
                print("ignoring zPosition set by MapKit")
            } else {
                super.zPosition = newValue
            }
        }
    }

    var fixedZPosition: CGFloat {
        get { return super.zPosition }
        set { super.zPosition = newValue }
    }

}

class MyAnnotationView: MKAnnotationView {

    weak var titleLabel: UILabel!

    override class var layerClass: AnyClass {
        return FixedZPositionLayer.self
    }

    var fixedZPosition: CGFloat {
        get {
            return (self.layer as! FixedZPositionLayer).fixedZPosition
        }
        set {
            (self.layer as! FixedZPositionLayer).fixedZPosition = newValue
        }
    }

    ...

    public func markAsSelected() -> Void {
        self.image = UIImage(named: "search_icon_pin_big")
        self.fixedZPosition = 10 // This is placed over secondary annotations but should be placed under user location annotation
    }
    public func markAsSecondary() -> Void {
        self.image = UIImage(named: "search_icon_pin_medium")
        self.fixedZPosition = 5 // This is placed under selected annotations 
    }
}

1 Ответ

0 голосов
/ 08 января 2019

В MKMapView есть метод для определения местоположения пользователей

let userLocation : MKUserLocation = mapView.userLocation

MKUserLocation соответствует MKAnnotation, поэтому вы можете использовать следующий метод для получения MKAnnotationView.

let userView = mapView.view(for: mapView.userLocation)
...