注意: - (整合AppleMap
,不与GoogleMap
合作)
我做了以下事情:
我的要求:
当用户移动到不同方向时,停留在同一个地方(或 不同的地方)引脚(在当前位置)应该自动 指出用户指向的方向。
例如:如果Boat显示在User Location位置并指向North,但如果用户向West移动,那么boat(User Location Pin)也应指向该方向。
尝试使用以下代码:
//MARK:Change Direction Methods
func angle(fromCoordinate first: CLLocationCoordinate2D, toCoordinate second: CLLocationCoordinate2D) -> Float {
let deltaLongitude = second.longitude - first.longitude
let deltaLatitude = second.latitude - first.latitude
let angle = (.pi * 0.5) - atan(deltaLatitude / deltaLongitude)
if deltaLongitude > 0 {
return Float(angle)
}
else if deltaLongitude < 0 {
return Float(angle) + .pi
}
else if deltaLatitude < 0 {
return .pi
}
return 0.0
}
//Animate direction of User Location
func animateUserLocation() {
//Old Coordinate (PLAT - Previous Lat , PLON - Previous Long)
let oldLocation = CLLocationCoordinate2D(latitude: UserDefaults.standard.value(forKey: "PLAT") as! CLLocationDegrees, longitude: UserDefaults.standard.value(forKey: "PLON") as! CLLocationDegrees)
//New Coordinate (PLAT - Current Lat , PLON - Current Long)
let newLocation = CLLocationCoordinate2D(latitude: UserDefaults.standard.value(forKey: "LAT") as! CLLocationDegrees, longitude: UserDefaults.standard.value(forKey: "LON") as! CLLocationDegrees)
let getAngle = angle(fromCoordinate:oldLocation, toCoordinate:newLocation)
var myAnnotation : RestaurantAnnotation?
if annotationArray.count > 0{
myAnnotation = annotationArray[0]
}
else {
return
}
UIView.animate(withDuration: 2, animations: {() -> Void in
myAnnotation?.coordinate = newLocation
let annotationView = self.map.view(for: myAnnotation!)
annotationView?.transform = CGAffineTransform(rotationAngle: CGFloat(getAngle))
})
//Save Previous lat long
UserDefaults.standard.set(UserDefaults.standard.value(forKey: "LAT"), forKey: "PLAT")
UserDefaults.standard.set(UserDefaults.standard.value(forKey: "LON"), forKey: "PLON")
UserDefaults().synchronize()
}
从animateUserLocation
方法调用didUpdateLocation
方法,但没有运气。
请分享你的建议我做错了什么。提前谢谢。
答案 0 :(得分:4)
了解iOS's
位置概念完全有助于解决有关AppleMap
。
要移动地图Pin或AnnotationView,我们可以使用CoreLocation
框架输出与用户当前位置相关的数据。
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager:CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.startUpdatingHeading()
}
func locationManager(manager: CLLocationManager!, didUpdateHeading heading: CLHeading!) {
// This will print out the direction the device is heading
println(heading.magneticHeading) }
}
}
在上面的示例中,“heading.magneticHeading
”将输出表示设备指向的方向的值。
下一步是使用这些值并相应地轮换AnnotationView
或Pin
。
CGAffineTransformMakeRotation
可以为此提供帮助。
例如,如果要旋转到imageview指向东北,这需要度数值为45,那么您的代码可能看起来像这样。
float degrees = 45
imageView.transform = CGAffineTransformMakeRotation(degrees * M_PI/180)
请注意,CGAffineTransformMakeRotation()
需要一个弧度值,在上面的示例中,我们通过将度数乘以半圆的数量将度数转换为弧度。
以下链接真有帮助:
最后解决了我的问题。希望这个完整的答案也有助于其他人。