在iOS地图中更改销钉方向[英] Change Pin direction in iOS Map

本文是小编为大家收集整理的关于在iOS地图中更改销钉方向的处理方法,想解了在iOS地图中更改销钉方向的问题怎么解决?在iOS地图中更改销钉方向问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

  • Swift 3.0
  • mkmapview
  • ios

注意: - (集成AppleMap,不使用GoogleMap)

我做了以下操作:

  1. 实现的地图并将自定义图像添加到用户位置注释
  2. 当地图打开时,它在正确位置显示用户位置

我的要求:

当用户搬到不同方向时停留在同一地点时(或 不同的位置)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方法,但没有运气.

请分享您的建议,我做错了什么.预先感谢.

推荐答案

理解iOS's位置概念完全有助于解决有关AppleMap的任何问题.

要移动地图引脚或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"将输出代表设备指向方向的值.

  • 0表示北方
  • 90表示东方
  • 180表示南方
  • 270表示西部
  • 之间的其他一切

下一步是使用这些值并相应地旋转您的AnnotationView或Pin.

CGAffineTransformMakeRotation可以帮助您.

例如,如果您想旋转到ImageView以指向东北,这需要45度值,您的代码可能看起来像这样.

float degrees = 45 
imageView.transform = CGAffineTransformMakeRotation(degrees * M_PI/180)

请注意,CGAffineTransformMakeRotation()期望有径向值,在上面的示例中,我们将学位转换为弧度,通过与半圆的数量相乘.

以下链接确实很有帮助:

最终解决了我的问题.希望这个完整的答案也对他人也有帮助.

本文地址:https://www.itbaoku.cn/post/924655.html