【问题标题】:How can I fix marker and GMSCircle on the center in Google Maps ios?如何在 Google Maps ios 的中心修复标记和 GMSCircle?
【发布时间】:2015-09-23 07:23:54
【问题描述】:

我想将标记和它的圆圈固定在地图的中心,而不考虑使用 swift 的位置坐标。如果用户在地图上移动相机,我希望它继续显示在中心而没有任何半径或标记闪烁,并且用户应该能够增加和减少圆的半径。 我用过

circle.position = mapView.camera.target
但它没有帮助。 所以我想知道我该怎么做? 请帮忙。

【问题讨论】:

    标签: ios swift google-maps


    【解决方案1】:

    您的ViewController 类需要实现GMSMapViewDelegate 中的func mapView(mapView: GMSMapView!, didChangeCameraPosition position: GMSCameraPosition!) 方法。

    func mapView(mapView: GMSMapView!, didChangeCameraPosition position: GMSCameraPosition!) 方法中,您可以更新圈子的位置。该方法在地图上的任何动画或手势期间被重复调用(或一次,如果明确设置了相机)。

    示例代码:

    class ViewController: UIViewController, GMSMapViewDelegate {
    
        var mapView: GMSMapView!
        var cirlce: GMSCircle!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let camera = GMSCameraPosition.cameraWithLatitude(-33.86,
                longitude: 151.20, zoom: 6)
            mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
            mapView.myLocationEnabled = true
            self.view = mapView
    
            mapView.delegate = self
    
            cirlce = GMSCircle(position: camera.target, radius: 100000)
            cirlce.fillColor = UIColor.redColor().colorWithAlphaComponent(0.5)
            cirlce.map = mapView
        }
    
        func mapView(mapView: GMSMapView!, didChangeCameraPosition position: GMSCameraPosition!) {
            print("\(position.target.latitude) \(position.target.longitude)")
            cirlce.position = position.target
        }
    
    }
    

    已编辑:

    如果您想制作一个与您的 mapView 相机移动无关的圆圈,您可以在您的 mapView 顶部制作一个圆形 UIView。

    示例代码:

    class ViewController: UIViewController {
    
        var mapView: GMSMapView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let camera = GMSCameraPosition.cameraWithLatitude(-33.86,
                longitude: 151.20, zoom: 6)
            mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
            mapView.myLocationEnabled = true
            self.view = mapView
    
            let circleView = UIView()
            circleView.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.5)
            view.addSubview(circleView)
            view.bringSubviewToFront(circleView)
            circleView.translatesAutoresizingMaskIntoConstraints = false
    
            let heightConstraint = NSLayoutConstraint(item: circleView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100)
            let widthConstraint = NSLayoutConstraint(item: circleView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100)
            let centerXConstraint = NSLayoutConstraint(item: circleView, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0)
            let centerYConstraint = NSLayoutConstraint(item: circleView, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0)
            NSLayoutConstraint.activateConstraints([heightConstraint, widthConstraint, centerXConstraint, centerYConstraint])
    
            view.updateConstraints()
            UIView.animateWithDuration(1.0, animations: {
                self.view.layoutIfNeeded()
                circleView.layer.cornerRadius = CGRectGetWidth(circleView.frame)/2
                circleView.clipsToBounds = true
            })
        }
    }
    

    【讨论】:

    • 好吧,我尝试了您的代码,但圆圈与相机一起抖动,这不是我想要做的。我想让圆圈在中心静止,它不应该移动。无论如何,它都应该停留在中心而不显示任何移动过渡。 @ztan
    • @ztan 地图移动时如何获取圆心坐标?
    • @Rao 你可以用CLLocationCoordinate2D coordinate = [mapView.projection coordinateForPoint:somePoint];
    【解决方案2】:

    这是 Swift 3 的更新版本

    import UIKit
    import GoogleMaps
    
    class ViewController: UIViewController, GMSMapViewDelegate {
    
    var mapView: GMSMapView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let camera = GMSCameraPosition.camera(withLatitude: -33.86,
                                              longitude: 151.20, zoom: 6)
        mapView = GMSMapView.map(withFrame: .zero, camera: camera)
        mapView.isMyLocationEnabled = true
        self.view = mapView
        
        mapView.delegate = self
        
        let circleView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 10))
        circleView.backgroundColor = UIColor.red.withAlphaComponent(0.5)
        view.addSubview(circleView)
        view.bringSubview(toFront: circleView)
        
        circleView.translatesAutoresizingMaskIntoConstraints = false
        let heightConstraint = NSLayoutConstraint(item: circleView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)
        let widthConstraint = NSLayoutConstraint(item: circleView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)
        let centerXConstraint = NSLayoutConstraint(item: circleView, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0)
        let centerYConstraint = NSLayoutConstraint(item: circleView, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0)
        NSLayoutConstraint.activate([heightConstraint, widthConstraint, centerXConstraint, centerYConstraint])
        
        view.updateConstraints()
        UIView.animate(withDuration: 1.0, animations: {
            self.view.layoutIfNeeded()
            circleView.layer.cornerRadius = circleView.frame.width/2
            circleView.clipsToBounds = true
        })
        
    }
    func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
        print("\(position.target.latitude) \(position.target.longitude)")
         } 
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多