on Top xác định
#define RadiansToDegrees(radians)(radians * 180.0/M_PI)
#define DegreesToRadians(degrees)(degrees * M_PI/180.0)
xác định biến này trong tập tin .h
float GeoAngle;
trong phương pháp đại biểu quản lý vị trí của bạn: -
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
GeoAngle = [self setLatLonForDistanceAndAngle:newLocation];
}
Và chức năng sẽ thực hiện như sau : -
-(float)setLatLonForDistanceAndAngle:(CLLocation *)userlocation
{
float lat1 = DegreesToRadians(userlocation.coordinate.latitude);
float lon1 = DegreesToRadians(userlocation.coordinate.longitude);
float lat2 = DegreesToRadians(locLat);
float lon2 = DegreesToRadians(locLon);
float dLon = lon2 - lon1;
float y = sin(dLon) * cos(lat2);
float x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
float radiansBearing = atan2(y, x);
if(radiansBearing < 0.0)
{
radiansBearing += 2*M_PI;
}
return radiansBearing;
}
Bạn sẽ nhận được góc cập nhật liên tục trong biến GeoAngle. để xoay mũi tên đến vị trí đích lấy hình ảnh mũi tên và gán nó cho IBOutlet của arrowImageView và xoay nó trên phương thức cập nhật tiêu đề.
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
float direction = -newHeading.trueHeading;
arrowImageView.transform=CGAffineTransformMakeRotation((direction* M_PI/180)+ GeoAngle);
}
Xem [this] (http://stackoverflow.com/questions/6745131/how-can-we-find-the-angle-between-two-locations-defined-by-latitude-or-longitude) và [this] (http://www.movable-type.co.uk/scripts/latlong.html) để tham khảo –