自定义注释图像仅在程序开始时旋转 (Swift- iOS)
Custom annotation image rotates only at the beginning of the Program (Swift- iOS)
请在这里帮助初学者 iOS 开发人员! :) 所以,我有一个计时器,它定期从 xml sheet 获取公交车的纬度和经度,它提供了公交车的实时位置。我能够设置解析器、制作公交车运动动画并为公交车设置自定义(箭头)图像。
但是,问题是,每次我获得新的纬度和经度值时,我都无法旋转总线注释。 busAnnotation
仅在程序启动时旋转,而不是每次更新总线方向时旋转。
下面是我的 xml parser
函数,它会在每次位置更改时计算 busDirection
。 busDirection
的值会随着位置的变化而正确变化,但随着计时器的继续,由于某种原因它不适用于旋转。注释的移动也有很好的动画,除了程序启动时它不会旋转。
// 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)))
}
}
请在这里帮助初学者 iOS 开发人员! :) 所以,我有一个计时器,它定期从 xml sheet 获取公交车的纬度和经度,它提供了公交车的实时位置。我能够设置解析器、制作公交车运动动画并为公交车设置自定义(箭头)图像。
但是,问题是,每次我获得新的纬度和经度值时,我都无法旋转总线注释。 busAnnotation
仅在程序启动时旋转,而不是每次更新总线方向时旋转。
下面是我的 xml parser
函数,它会在每次位置更改时计算 busDirection
。 busDirection
的值会随着位置的变化而正确变化,但随着计时器的继续,由于某种原因它不适用于旋转。注释的移动也有很好的动画,除了程序启动时它不会旋转。
// 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)))
}
}