2017-08-31 11 views
1

私は、iOS SwiftアプリケーションでGoogleマップを使用しています。私はいくつかのアニメーションを適用することができるように私は現在のユーザー座標のCGPointの位置を取得しようとしています。しかし私は自分の座標をCGPointで取得することができません。CLLocationCoordinate2D座標をCGPoint Swiftに変換する

私は基本的に現在のユーザーマーカーにパルスアニメーションを追加しようとしています。

class Pulsing: CALayer { 
    var animationGroup = CAAnimationGroup() 

    var initialPulseSacle:Float = 0 
    var nextPluseAfter:TimeInterval = 0 
    var animationDuration:TimeInterval = 1.5 
    var radius:CGFloat = 200 
    var numberOfPulse:Float = Float.infinity 

    override init(layer: Any) { 
     super.init(layer: layer) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    init(numberOfPulse:Float = Float.infinity, radius:CGFloat, position:CGPoint){ 
      super.init() 
      self.backgroundColor = UIColor.blue.cgColor 
      self.contentsScale = UIScreen.main.scale 
      self.opacity = 0 
      self.radius = radius 
      self.position = position 

      self.bounds = CGRect(x: 0, y: 0, width: radius*2, height: radius*2) 
      self.cornerRadius = radius 

      DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
       self.setupAnimationGroup() 

       DispatchQueue.main.async { 
        self.add(self.animationGroup, forKey: "pulse") 
       } 
      } 

    } 
    func createScaleAnimation() -> CABasicAnimation{ 
     let scaleAnimation = CABasicAnimation(keyPath: "transferm.scale.xy") 
     scaleAnimation.fromValue = NSNumber(value: initialPulseSacle) 
     scaleAnimation.toValue = NSNumber(value: 1) 
     scaleAnimation.duration = animationDuration 
     return scaleAnimation 
    } 
    func createOpacityAnimation() -> CAKeyframeAnimation{ 
     let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity") 
     opacityAnimation.duration = animationDuration 
     opacityAnimation.values = [4.0, 8.0, 0] 
     opacityAnimation.keyTimes = [0, 0.2, 1] 
     return opacityAnimation 
    } 

    func setupAnimationGroup(){ 
     self.animationGroup = CAAnimationGroup() 
     self.animationGroup.duration = animationDuration + nextPluseAfter 
     self.animationGroup.repeatCount = numberOfPulse 
     let defaultCurve = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 
     self.animationGroup.timingFunction = defaultCurve 
     self.animationGroup.animations = [createScaleAnimation(),createOpacityAnimation()] 
    } 

} 

そして、これは私が私のセットアップマーカー方法でそれを呼び出しています方法です - - ここでは、アニメーションのための私のコードがある

func setuplocationMarker(coordinate: CLLocationCoordinate2D,address:String) { 
     locationMarker = GMSMarker(position: coordinate) 
     locationMarker.map = viewMap 
     locationMarker.title = address 
     locationMarker.appearAnimation = GMSMarkerAnimation.pop 
     locationMarker.icon = GMSMarker.markerImage(with: UIColor.red) 
     locationMarker.opacity = 0.75 

     let pulse = Pulsing(numberOfPulse: 1, radius: 80, position:CGPoint(x: CGFloat(Float(coordinate.latitude)), y: CGFloat(Float(coordinate.longitude)))) 
     pulse.animationDuration = 0.8 
     pulse.backgroundColor = UIColor.blue.cgColor 
     self.view.layer.insertSublayer(pulse, below: locationMarker.layer) 
    } 

このコードでは、それはトップのletコーナーでパルスアニメーションを示し、ロケーションマーカーの周りではありません。私のマーカーの正しいcgpointの位置を取得するにはどうすればいいですか?前もって感謝します!

+0

可能な複製(HTTPS ://stackoverflow.com/questions/15066567/how-to-get-cgpoint-of-location-with-google-maps-sdk-for-ios) –

+0

この回答を確認してください:https://stackoverflow.com/a/ 15013705/3824808 –

答えて

2

緯度と経度を使用して直接CLLocationCoordinate2DCGPointに変換することはできません。ほとんどのマップAPIはこれを行う方法を提供します。

pointFromCoordinate GoogleマップAPIはCGPointGMSMapViewのフレームに作成します。これはのメソッドで、GMSMapViewの 'projection'プロパティから取得します。

あなたはその後、例えばAppleのconvertPoint:toView: を使用して別のUIViewの座標空間にそのを翻訳することができます[?iOS用GoogleマップSDKで場所のするCGPointを取得する方法]の

let location = mapView.userLocation 
let point = mapView.projection.pointFromCoordinate(location.coordinate) 
let pointInNewView = newView.convert(point, from: mapView) 
+1

それを解決します!おかげでトン! –

関連する問題