我可以从GMSMarker点获得UIScreen点吗?

时间:2018-11-13 10:41:01

标签: ios swift animation google-maps-markers gmsmapview

我已将google map视图包含在我的项目中,并成功在其上显示了标记。 Google地图仅提供标记的流行动画。我要为标记放动画。

我已经成功实现了半径动画的放大和缩小,但是需要放下标记动画。

所以我的想法就像,如果我将标记的确切点放到UIScreen中,那么我将从屏幕顶部放下图钉,从而产生放下动画的效果。

最后我从下面的代码中获得了放动画,但是存在一个问题,我没有从mapview中获得完美的点来显示放动画。

//Drop pin
    func setMarker(latitude : Double, longitude : Double, isForJobLocation : Bool = false){

        let point = mapView.projection.point(for: CLLocationCoordinate2D(latitude: latitude, longitude:  longitude))
        let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)

        print(viewPoints)

        self.showAnimatation(xPosition: viewPoints.x, yPosition: viewPoints.y) {

            let marker1 = GMSMarker(position: CLLocationCoordinate2D(latitude: latitude, longitude:  longitude))
            marker1.icon = UIImage(named: "mapLoadingPin")
            marker1.map = self.mapView
        }

    }

    func showAnimatation(xPosition : CGFloat, yPosition : CGFloat, completion : @escaping (() -> ())){

        let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))
        imageView.image = UIImage(named: "mapLoadingPin")
        self.view.addSubview(imageView)

        UIView.animate(withDuration: 1.0, animations: {
            imageView.frame.origin.y = yPosition
            self.view.layoutIfNeeded()
        }) { (true) in
            imageView.removeFromSuperview()
            completion()
        }
    }

请帮助我。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我在您的代码中看到两个问题:

  1. 您将CGPoint从mapView转换为keyWindow的坐标系。但是随后,您将使用为窗口计算的CGPoint将imageView添加到视图中。

  2. 您没有考虑imageViews的大小。我猜您的标记图像应该水平放置在地图上该点上方的中心位置。 (但这取决于您标记图像的设计)


以下更改将解决您的问题:

  • 将GMSMarkers原点转换为imageView的parentView的坐标系。替换

    let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)

    使用

    let viewPoints = self.view.convert(point, from: mapView)

  • 考虑imageViews的大小。 imageView(动画之后)的原点应该是(xPosition-imageView.width / 2,yPosition-imageView.height)。在您的示例中,替换

    let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))

    使用

    let imageView = UIImageView(frame: CGRect(x: xPosition - 22, y: yPosition - 44 - 100, width: 44, height: 44))


如果这不能解决您的问题,请提供一个屏幕快照,显示放错位置的imageView,从而帮助我们为您提供帮助。

答案 1 :(得分:0)

我已经测试了您的代码,而您的问题是将origin.y用于imageView框架。

  

指定矩形原点坐标的点。

根据Apple文档,来源类型代表CGRect的minX和minY。因此,您应该像这样重构自己的位置:

imageView.frame.origin.y = yPosition - imageView.bounds.height