用户位置MKAnnotationView相对于iOS 10、11、12中其他注释的显示顺序

时间:2019-01-08 18:25:32

标签: ios mapkit mkannotation mkannotationview

如何设置默认用户位置,使其位于其他注释的前面。

对于iOS 10 layer.zPosition在任何注释上都可以正常工作。在iOS 11中,Apple更改了某些内容和layer.zPosition不再起作用,因为MKMapView会自动修改zPosition。我知道我可以将自定义CALayer与固定的zPosition和棘手的设置器一起使用,而这仅在iOS 11中什么也不做,但是我如何控制默认用户位置注释又称为MKUserLocation的zPosition

这是我的代码。它可在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 :(得分:0)

MKMapView有一种获取用户位置的方法

let userLocation : MKUserLocation = mapView.userLocation

MKUserLocation符合MKAnnotation,因此可以使用以下方法获取MKAnnotationView。

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