【问题标题】:Can I get UIScreen points from GMSMarker points?我可以从 GMSMarker 积分中获得 UIScreen 积分吗?
【发布时间】:2019-04-16 04:18:22
【问题描述】:

我已在我的项目中包含谷歌地图视图并成功在其上显示标记。谷歌地图只提供标记的弹出动画。我想要为标记放置动画。

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

所以我的想法是,如果我在 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()
        }
    }

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

【问题讨论】:

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


    【解决方案1】:

    我在您的代码中发现了两个问题:

    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 的原点(after 动画)应该是(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))


    如果这不能解决您的问题,请帮助我们通过提供显示错位的 imageViews 的屏幕截图来帮助您。

    【讨论】:

      【解决方案2】:

      我已经测试了您的代码,您的问题是使用 origin.y 作为您的 imageView 框架。

      指定矩形原点坐标的点。

      根据 Apple 文档,origin 排序代表您的 CGRect 的 minX 和 minY。所以,你应该重构你的位置:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多