123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- //
- // IMLocationChooseController.swift
- // O2Platform
- //
- // Created by FancyLou on 2020/6/18.
- // Copyright © 2020 zoneland. All rights reserved.
- //
- import UIKit
- import CocoaLumberjack
- typealias O2LocationChooseCallback = (_ result: O2LocationData) -> Void ///< 定义确认回调
- class IMLocationChooseController: UIViewController {
-
- static func openChooseLocation(callback: @escaping O2LocationChooseCallback) -> IMLocationChooseController {
- let vc = IMLocationChooseController()
- vc.callback = callback
- return vc
- }
-
-
- @IBOutlet weak var mapContainerView: UIView!
- @IBOutlet weak var addressLabel: UILabel!
- var callback: O2LocationChooseCallback?
- private var mapView: BMKMapView!
- private var locService: BMKLocationManager!
- private var searchAddress: BMKGeoCodeSearch!
- private var annotation: BMKPointAnnotation!
- private var result: O2LocationData?
-
- override func viewDidLoad() {
- super.viewDidLoad()
- self.title = "选择位置"
- self.navigationItem.backBarButtonItem = UIBarButtonItem(image: UIImage(named: "icon_fanhui"), style: .plain, target: nil, action: nil)
- //发送按钮
- self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "发送", style: .plain, target: self, action: #selector(sendLocation))
- self.showLoading()
- self.addressLabel.text = "点击地图选择位置"
- //初始化地图和定位
- let containerFrame = self.mapContainerView.frame
- mapView = BMKMapView(frame: CGRect(x: 0, y: 0, width: containerFrame.width, height: containerFrame.height))
- mapView.zoomLevel = 17
- mapView.showMapPoi = true
- mapView.showIndoorMapPoi = true
- self.mapContainerView.addSubview(mapView)
- mapView.delegate = self
- locService = BMKLocationManager()
- locService.delegate = self
- locService.startUpdatingLocation()
- searchAddress = BMKGeoCodeSearch()
- searchAddress.delegate = self
- }
- @objc private func sendLocation() {
- guard let r = self.result else {
- self.showError(title: "请选择一个位置!")
- return
- }
- self.callback?(r)
- self.navigationController?.popViewController(animated: false)
- }
- deinit {
- mapView.delegate = nil
- locService.delegate = nil
- locService.stopUpdatingLocation()
- searchAddress.delegate = nil
- }
- }
- extension IMLocationChooseController: BMKMapViewDelegate, BMKLocationManagerDelegate, BMKGeoCodeSearchDelegate {
- //定位
- func bmkLocationManager(_ manager: BMKLocationManager, didUpdate location: BMKLocation?, orError error: Error?) {
- if let loc = location?.location {
- DDLogDebug("定位到 当前位置,\(loc.coordinate.latitude),\(loc.coordinate.longitude)")
- let user = BMKUserLocation()
- user.location = loc
- mapView.updateLocationData(user)
- mapView.centerCoordinate = CLLocationCoordinate2D(latitude: loc.coordinate.latitude, longitude: loc.coordinate.longitude)
- //定位完成停止定位
- locService.stopUpdatingLocation()
- self.hideLoading()
- }
- }
- //位置搜索
- func onGetReverseGeoCodeResult(_ searcher: BMKGeoCodeSearch!, result: BMKReverseGeoCodeSearchResult!, errorCode error: BMKSearchErrorCode) {
- DDLogDebug("获取到地址: \(String(describing: result.address))")
- self.addressLabel.text = result.address
- //todo 地址和位置经纬度要保存起来
- if self.result == nil {
- self.result = O2LocationData()
- }
- self.result?.address = result.address
- self.result?.addressDetail = result.sematicDescription
- self.result?.latitude = result.location.latitude
- self.result?.longitude = result.location.longitude
- }
- //地图
- func mapView(_ mapView: BMKMapView!, onClickedMapPoi mapPoi: BMKMapPoi!) {
- if annotation == nil {
- annotation = BMKPointAnnotation()
- annotation.coordinate = mapPoi.pt
- mapView.addAnnotation(annotation)
- } else {
- annotation.coordinate = mapPoi.pt
- }
- //反向查询具体地址名称
- let re = BMKReverseGeoCodeSearchOption()
- re.location = mapPoi.pt
- let flag = searchAddress.reverseGeoCode(re)
- DDLogDebug("根据位置坐标,查询地址信息 \(flag)")
- }
- func mapView(_ mapView: BMKMapView!, onClickedMapBlank coordinate: CLLocationCoordinate2D) {
- //单击
- if annotation == nil {
- annotation = BMKPointAnnotation()
- annotation.coordinate = coordinate
- mapView.addAnnotation(annotation)
- } else {
- annotation.coordinate = coordinate
- }
- //反向查询具体地址名称
- let re = BMKReverseGeoCodeSearchOption()
- re.location = coordinate
- let flag = searchAddress.reverseGeoCode(re)
- DDLogDebug("根据位置坐标,查询地址信息 \(flag)")
- }
- }
|