mapas - Cambiar la dirección del pin en el mapa de iOS
apple maps para pc (1)
Comprender iOS''s
conceptos de ubicación iOS''s
completamente ayuda a resolver cualquier problema relacionado con AppleMap
.
Para mover el mapa Pin o AnnotationView, podemos usar el marco CoreLocation
que genera datos relacionados con la ubicación actual de los usuarios.
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) }
}
}
En el ejemplo anterior, " heading.magneticHeading
" mostrará un valor que representa la dirección hacia la que apunta el dispositivo.
- 0 significa norte
- 90 significa este
- 180 significa sur
- 270 significa oeste
- todo lo demás en el medio
El siguiente paso es usar esos valores y rotar su AnnotationView
o Pin
consecuencia.
CGAffineTransformMakeRotation
puede ayudar con esto.
Por ejemplo, si desea rotar a la vista de la imagen para apuntar al noreste, lo que requeriría un valor de grado de 45, su código podría verse más o menos así.
float degrees = 45
imageView.transform = CGAffineTransformMakeRotation(degrees * M_PI/180)
Solo tenga en cuenta que CGAffineTransformMakeRotation()
espera un valor de radian, en el ejemplo de arriba hemos convertido grados a radianes multiplicando grados con el número de medios círculos.
Los siguientes enlaces realmente útiles:
- https://stackoverflow.com/a/7634232/3400991
Finalmente resolvió mi problema. Espero que esta respuesta completa ayude a otros también.
- SWIFT 3.0
- MKMAPVIEW
- iOS
Nota: - ( AppleMap
integrado, no funciona con GoogleMap
)
He hecho lo siguiente:
- Mapa implementado e imagen personalizada añadida a la anotación de ubicación del usuario
- Cuando el mapa está abierto, muestra la ubicación del usuario en el lugar correcto
Mi requisito:
Cuando el usuario se mueve en una dirección diferente y permanece en el mismo lugar (o lugar diferente), el pin (en la ubicación actual) debe apuntar automáticamente a la dirección en la que señala el usuario.
Por ejemplo: si el barco se muestra en la posición de ubicación del usuario y apunta hacia el norte, pero si el usuario se mueve hacia el oeste, el bote (el pin de ubicación del usuario) también debe apuntar a esa dirección.
Intentó con el siguiente código:
//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()
}
Se animateUserLocation
método animateUserLocation
método didUpdateLocation
pero no tiene suerte.
Amablemente comparta su sugerencia sobre lo que estoy haciendo mal. Gracias por adelantado.