2017-08-27 119 views
1

我想根据路线方向旋转标记图像。我已经使用Map box SDK实现了地图。坐标&方向是通过webservice获取的。 我试过imageForMarker,但它没有奏效。 Implemetation是使用自定义的重用标识符遵循如何在Mapbox 3.6中旋转汽车标记图像?

func mapView(_ mapView: MGLMapView, imageFor annotation: MGLAnnotation) -> MGLAnnotationImage? { 

    let img = imageRotatedByDegrees(oldImage: UIImage(named: "car")!, deg: CGFloat(self.bearing)) 

    return MGLAnnotationImage(image: img, reuseIdentifier: "car") 
} 
func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage 
{ 
    let size = oldImage.size 

    UIGraphicsBeginImageContext(size) 

    let bitmap: CGContext = UIGraphicsGetCurrentContext()! 
    //Move the origin to the middle of the image so we will rotate and scale around the center. 
    bitmap.translateBy(x: size.width/2, y: size.height/2) 
    //Rotate the image context 
    bitmap.rotate(by: (degrees * CGFloat(Double.pi/180))) 
    //Now, draw the rotated/scaled image into the context 
    bitmap.scaleBy(x: 1.0, y: -1.0) 

    let origin = CGPoint(x: -size.width/2, y: -size.width/2) 

    bitmap.draw(oldImage.cgImage!, in: CGRect(origin: origin, size: size)) 

    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    return newImage 
} 

回答

0

尝试,就像这样:

func mapView(_ mapView: MGLMapView, imageFor annotation: MGLAnnotation) -> MGLAnnotationImage? { 
    let annotation = annotation as! CustomMapAnnotation 

    var annotationImage = mapView.dequeueReusableAnnotationImage(withIdentifier: annotation.id) 

    if annotationImage == nil { 
     var image = UIImage(named: "taxi")! 

     if let heading = annotation.heading { 
      image = image.imageRotatedByDegrees(degrees: heading) 
     } 
     image = image.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: image.size.height/2, right: 0)) 

     annotationImage = MGLAnnotationImage(image: image, reuseIdentifier: annotation.id) 
    } 

    return annotationImage 
} 
+0

如果此注释离开屏幕,则返回它总是会面向相同的方向。如果该值以某种方式得到更新,则不会。对于OP跟踪当前用户位置的情况,这可能不起作用。似乎每次都需要使用独特的MGLAnnotationImage,或者至少将可能的标题分解为间隔(例如30或15度),并且对于每个可能的间隔具有单个重用标识符。标题可能不准确,但足够接近。我会选择15或30,因为这样你就会达到所有四个主要方向。 –