如何在Swift中创建MKCircle?

时间:2015-10-23 00:38:46

标签: swift mkmapview

我一直在四处寻找如何使用Swift 2.0为MapView制作MKCircle注释的一个很好的解释,但我似乎找不到充分的解释。有人可以发布一些示例代码来展示如何创建MKCircle注释吗?以下是我用于制作地图并获取坐标的代码。

let address = self.location

let geocoder = CLGeocoder()

    geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
        if((error) != nil){
            print("Error", error)
        }
        if let placemark = placemarks?.first {
            let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate

            self.locationCoordinates = coordinates
            let span = MKCoordinateSpanMake(0.005, 0.005)
            let region = MKCoordinateRegion(center: self.locationCoordinates, span: span)
            self.CIMap.setRegion(region, animated: true)

            let annotation = MKPointAnnotation()
            annotation.coordinate = self.locationCoordinates
            self.CIMap.addAnnotation(annotation)

            self.CIMap.layer.cornerRadius = 10.0

            self.CIMap.addOverlay(MKCircle(centerCoordinate: self.locationCoordinates, radius: 1000))
        }
    })

3 个答案:

答案 0 :(得分:7)

首先,您需要将MKMapViewDelegate添加到类defenition。

 mapView.delegate = self 

在viewDidLoad中将地图委托设置为自己。

设置注释

mapView.addOverlay(MKCircle(centerCoordinate: CLLocationCoordinate2D, radius: CLLocationDistance))
现在应该在mapViews委托中调用mapView rendererForOverlay并在那里绘制它

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    if let overlay = overlay as? MKCircle {
        let circleRenderer = MKCircleRenderer(circle: overlay)
        circleRenderer.fillColor = UIColor.blueColor()
        return circleRenderer
    }
}

此外,您需要导入MapKit才能编译

答案 1 :(得分:3)

将使用带有xcode 8.3.3的swift 3显示如何在地图视图上创建圆形叠加的逐步方法

在你的主故事板文件中拖动地图工具包视图到故事板的场景(视图)并创建相同的插座,这里我创建了mapView。你也想在地图上长按时动态创建叠加,所以将长按手势识别器拖到对象库中的mapView上,然后为它创建动作方法,这里我创建了相同的addRegion()。

  1. 为CLLocationManager类创建一个全局常量,以便可以在每个函数中访问它。在viewDidLoad方法中,添加一些代码以获取用户的授权。

        import UIKit  
        import MapKit
    
        class ViewController: UIViewController {
    
    
            @IBOutlet var mapView: MKMapView!
            let locationManager = CLLocationManager()
    
        override func viewDidLoad() {  
                super.viewDidLoad()
    
                locationManager.delegate = self
                locationManager.requestAlwaysAuthorization()
                locationManager.requestWhenInUseAuthorization()
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                locationManager.startUpdatingLocation()
    
            }
    
  2. 在长按手势识别器操作方法addRegion()中长按手势识别器时,添加用于生成圆形区域的代码。

        @IBAction func addRegion(_ sender: Any) {  
                print("addregion pressed")  
                guard let longPress = sender as? UILongPressGestureRecognizer else {return}
    
                let touchLocation = longPress.location(in: mapView)
                let coordinates = mapView.convert(touchLocation, toCoordinateFrom: mapView)
                let region = CLCircularRegion(center: coordinates, radius: 5000, identifier: "geofence")
                mapView.removeOverlays(mapView.overlays)
                locationManager.startMonitoring(for: region)
                let circle = MKCircle(center: coordinates, radius: region.radius)
                mapView.add(circle)
    
            }
    
  3. 在地图上渲染圆圈之前,你仍然不会在地图上看到圆圈。为此,您需要实现mapviewdelegate的委托。

            func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {}
    
    1. 为了使代码看起来更清晰,您可以在课程结束后的最后一个大括号后创建扩展名。一个扩展包含CLLocationManagerDelegate的代码和MKMapViewDelegate的其他代码。

          extension ViewController: CLLocationManagerDelegate {
              func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
                  locationManager.stopUpdatingLocation()
                  mapView.showsUserLocation = true
              }
          }
      
    2. 你应该在委托方法中调用locationManager.stopUpdatingLocation(),这样你的电池就不会耗尽。

              extension ViewController: MKMapViewDelegate {
                  func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
                      guard let circelOverLay = overlay as? MKCircle else {return MKOverlayRenderer()}
      
                      let circleRenderer = MKCircleRenderer(circle: circelOverLay)
                      circleRenderer.strokeColor = .blue
                      circleRenderer.fillColor = .blue
                      circleRenderer.alpha = 0.2
                      return circleRenderer
                  }
              }
      

      这里我们在屏幕上制作实际的圆圈。

      最终代码应如下所示。

      import UIKit
      import MapKit
      
      class ViewController: UIViewController {
      
      
          @IBOutlet var mapView: MKMapView!
          let locationManager = CLLocationManager()
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              locationManager.delegate = self
              locationManager.requestAlwaysAuthorization()
              locationManager.requestWhenInUseAuthorization()
              locationManager.desiredAccuracy = kCLLocationAccuracyBest
              locationManager.startUpdatingLocation()
      
          }
      
          // MARK: Long Press Gesture Recognizer Action Method
      
          @IBAction func addRegion(_ sender: Any) {
              print("addregion pressed")
              guard let longPress = sender as? UILongPressGestureRecognizer else {return}
      
              let touchLocation = longPress.location(in: mapView)
              let coordinates = mapView.convert(touchLocation, toCoordinateFrom: mapView)
              let region = CLCircularRegion(center: coordinates, radius: 5000, identifier: "geofence")
              mapView.removeOverlays(mapView.overlays)
              locationManager.startMonitoring(for: region)
              let circle = MKCircle(center: coordinates, radius: region.radius)
              mapView.add(circle)
      
          }
      
      }
      
      extension ViewController: CLLocationManagerDelegate {
          func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
              locationManager.stopUpdatingLocation()
              mapView.showsUserLocation = true
          }
      }
      
      extension ViewController: MKMapViewDelegate {
          func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
              guard let circelOverLay = overlay as? MKCircle else {return MKOverlayRenderer()}
      
              let circleRenderer = MKCircleRenderer(circle: circelOverLay)
              circleRenderer.strokeColor = .blue
              circleRenderer.fillColor = .blue
              circleRenderer.alpha = 0.2
              return circleRenderer
          }
      }
      

答案 2 :(得分:1)

叠加层只是一组数字。地图视图中可见的是叠加渲染器。您必须实施mapView:rendererForOverlay:才能提供叠加渲染器;否则,你什么也看不见。