自定义注释图像仅在程序开始时旋转 (Swift- iOS)

Custom annotation image rotates only at the beginning of the Program (Swift- iOS)

请在这里帮助初学者 iOS 开发人员! :) 所以,我有一个计时器,它定期从 xml sheet 获取公交车的纬度和经度,它提供了公交车的实时位置。我能够设置解析器、制作公交车运动动画并为公交车设置自定义(箭头)图像。

但是,问题是,每次我获得新的纬度和经度值时,我都无法旋转总线注释。 busAnnotation仅在程序启动时旋转,而不是每次更新总线方向时旋转。

下面是我的 xml parser 函数,它会在每次位置更改时计算 busDirectionbusDirection 的值会随着位置的变化而正确变化,但随着计时器的继续,由于某种原因它不适用于旋转。注释的移动也有很好的动画,除了程序启动时它不会旋转。

// Some constants
var oldLatitude: Double? = 44.97234
var oldLongitude: Double? = -93.2446329
var busDirection: CLLocationDirection()

func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) {
    if (elementName == "vehicle") {
        var latitude = attributeDict["lat"]?.doubleValue            // Get latitude of bus from xml
        var longitude = attributeDict["lon"]?.doubleValue           // Get longitude of bus from xml

        if (oldLatitude == latitude && oldLongitude == longitude) {
            return
        }
        else {  // Update bus location         
            busDirection = directionBetweenPoints(MKMapPointForCoordinate(CLLocationCoordinate2DMake(oldLatitude!, oldLongitude!)), destinationPoint: MKMapPointForCoordinate(CLLocationCoordinate2DMake(latitude!, longitude!)))       // Get direction of bus:

            UIView.animateWithDuration(0.5) {
                self.busAnnotation.coordinate = CLLocationCoordinate2DMake(latitude!, longitude!)                  
                self.mapView(self.map, viewForAnnotation: self.busAnnotation).annotation = self.busAnnotation
                self.map.addAnnotation(self.busAnnotation)                 
            }

            oldLatitude = latitude
            oldLongitude = longitude
        }
    }
}

这是我实现的 'viewForAnnotation' 以更改注释的图像并据称旋转它

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    let reuseId = "pin" 
    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView  

    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.image = imageWithImage(UIImage(named:"arrow.png")!, scaledToSize: CGSize(width: 25.0, height: 25.0))       // Set custom image for annotation and resize it         
    }
    else {
        pinView!.annotation = annotation
    }   

    // Rotate the annotation.
    pinView?.transform = CGAffineTransformRotate(self.map.transform, CGFloat(degreesToRadians(self.busDirection)))
    return pinView
}

这些是我在上述方法中使用的一些辅助函数:

// For rotating bus annotations:
func degreesToRadians(degrees: Double) -> Double { return degrees * M_PI / 180.0 }
func radiansToDegrees(radians: Double) -> Double { return radians * 180.0 / M_PI }

func directionBetweenPoints(sourcePoint: MKMapPoint, destinationPoint : MKMapPoint) -> CLLocationDirection {
    let x : Double = destinationPoint.x - sourcePoint.x;
    let y : Double = destinationPoint.y - sourcePoint.y;

    return fmod(radiansToDegrees(atan2(y, x)), 360.0) + 90.0;
}

你们认为我在这里遗漏了什么吗?每次更新位置时,我将如何旋转总线注释?提前致谢。

旋转仅在地图视图第一次为注释创建视图时发生。不是每次注释更新时都创建一个新视图,而是简单地移动视图。这对于地图视图来说效率更高。 所以,你应该做的是使 pinView 成为 属性,在你的初始化方法中实例化它,return 在 mapView(, viewForAnnotation:) 中将旋转直接应用于 [=11] =] 在你的动画块中。

UIView.animateWithDuration(0.5) {
    self.busAnnotation.coordinate = CLLocationCoordinate2DMake(latitude!, longitude!)                  
    self.map.addAnnotation(self.busAnnotation)
    if let pv = self.pinView {
        pv.transform = CGAffineTransformRotate(self.map.transform, CGFloat(degreesToRadians(self.busDirection)))
    }              
}