iOS开发人员:在MapBox中为用户批注使用自定义图像

iOS开发人员:在MapBox中为用户批注使用自定义图像,ios,swift,mapbox,Ios,Swift,Mapbox,我对IOS开发非常陌生,所以其中一些可能看起来很明显。我试着把和的例子结合起来 我觉得我需要添加以下代码行,并以某种方式将此代码附加到第一个链接中描述的用户注释中,但我不知道如何做到这一点。我猜我也可以在customUserLocationAnnotationView中插入其中一些函数,但是没有明显的指示器来指示在该类中放置这些函数的位置 func mapView(_ mapView: MGLMapView, imageFor annotation: MGLAnnotation) -> M

我对IOS开发非常陌生,所以其中一些可能看起来很明显。我试着把和的例子结合起来

我觉得我需要添加以下代码行,并以某种方式将此代码附加到第一个链接中描述的用户注释中,但我不知道如何做到这一点。我猜我也可以在customUserLocationAnnotationView中插入其中一些函数,但是没有明显的指示器来指示在该类中放置这些函数的位置

func mapView(_ mapView: MGLMapView, imageFor annotation: MGLAnnotation) -> MGLAnnotationImage? {
var annotationImage = mapView.dequeueReusableAnnotationImage(withIdentifier: "pisa")

if annotationImage == nil {
          var image = UIImage(named: "pisavector")!
          image = image.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: image.size.height/2, right: 0))
          annotationImage = MGLAnnotationImage(image: image, reuseIdentifier: "pisa")
     }
     return annotationImage
}

func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
     return true
}
编辑

我不只是想把一个图像放在这样一个随机的位置

我希望图像以用户注释为中心,当用户移动时,图像也会移动,如下图所示

作为旁注

我还收到了错误“未能渲染和更新ViewController(BYZ-38-tOr)的自动布局状态:代理崩溃了Main.storyboard”,但我认为这并不重要,因为我的程序仍然可以在模拟器上正常构建和运行

override func viewDidLoad() {
    super.viewDidLoad()
    let mapView = MGLMapView(frame: view.bounds)
    mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    mapView.delegate = self

    mapView.userTrackingMode = .followWithHeading
    mapView.showsUserHeadingIndicator = true
    view.addSubview(mapView)
}  

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
// Substitute our custom view for the user location annotation. This custom view is defined below.
    if annotation is MGLUserLocation && mapView.userLocation != nil {
        return CustomUserLocationAnnotationView()
    }
    return nil
}

// Create a subclass of MGLUserLocationAnnotationView.
class CustomUserLocationAnnotationView: MGLUserLocationAnnotationView {
    ...
}
看看这个例子:

CustomUserLocationAnnotationView中有一个名为setupLayers的方法。可变点是CALayer,因此可以将UIImage添加到CALayer。在private func setupLayers()中更改代码,如下所示:

dot = CALayer()
let myImage = UIImage(named: "star")?.cgImage
dot.contents = myImage
layer.addSublayer(dot)
看看这个例子:

CustomUserLocationAnnotationView中有一个名为setupLayers的方法。可变点是CALayer,因此可以将UIImage添加到CALayer。在private func setupLayers()中更改代码,如下所示:

dot = CALayer()
let myImage = UIImage(named: "star")?.cgImage
dot.contents = myImage
layer.addSublayer(dot)
这段代码适合我(使用Mapbox iOS SDK 3.6.0/Swift 4.2/iOS 12.1)。使用的图像是24位PNG。以2倍或4倍的标称尺寸保存图像,可以获得干净、无锯齿的图像(我无法区分两者之间的区别)

这段代码适合我(使用Mapbox iOS SDK 3.6.0/Swift 4.2/iOS 12.1)。使用的图像是24位PNG。以2倍或4倍的标称尺寸保存图像,可以获得干净、无锯齿的图像(我无法区分两者之间的区别)


当我将底部代码添加到viewDidLoad函数时,我收到错误
无法对“MGLMapView”类型的非可选值使用可选链接
。当我删除可选链接时,构建就失败了。。。。。。。另外,我正在尝试更改userAnnotation,这样做可以吗?我关心具体的纬度和经度坐标,因为图像应该设置在用户的坐标上。@Jacob我编辑了底部代码,错误是因为我将“地图视图”定义为可选,而您定义为非可选。对于坐标,您需要设置用户位置,而不是示例坐标。将此代码用于用户位置:annotation.coordinate=mapView.userLocation.coordinate,顶部代码将更改注释图像。这不是我想要的。我在问题中发布了一个编辑供您查看。我希望能够改变中心的蓝点,以便它显示我的图像。当用户更改位置时,带有“随用户移动”的图像。@Jacob好的,您要自定义用户位置注释,我编辑了答案。是的,我在问题中发布了一个链接以感谢示例,但我真的不知道要在CustomUserLocationAnnotation中更改什么才能使批注成为图像。当我将底部代码添加到viewDidLoad函数时,我收到错误
无法对“MGLMapView”类型的非可选值使用可选链接。
。当我删除可选链接时,构建就失败了。。。。。。。另外,我正在尝试更改userAnnotation,这样做可以吗?我关心具体的纬度和经度坐标,因为图像应该设置在用户的坐标上。@Jacob我编辑了底部代码,错误是因为我将“地图视图”定义为可选,而您定义为非可选。对于坐标,您需要设置用户位置,而不是示例坐标。将此代码用于用户位置:annotation.coordinate=mapView.userLocation.coordinate,顶部代码将更改注释图像。这不是我想要的。我在问题中发布了一个编辑供您查看。我希望能够改变中心的蓝点,以便它显示我的图像。当用户更改位置时,带有“随用户移动”的图像。@Jacob好的,您要自定义用户位置注释,我编辑了答案。是的,我在问题中发布了一个链接以感谢示例,但是我真的不知道要在CustomUserLocationAnnotation中更改什么才能使注释成为图像。您可以共享您使用的Mapbox Maps SDK的哪个版本吗?@jmkiley我不知道哪个版本。可能是最近的一次。我只是用cocoapods下载的。你能分享一下你使用的Mapbox Maps SDK的版本吗?@jmkiley我不知道是什么版本。可能是最近的一次。我只是用cocoapods下载的。