import UIKit
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
lazy var locationM: CLLocationManager = {
let locationM = CLLocationManager()
if #available(iOS 8.0, *) {
locationM.requestAlwaysAuthorization()
}
return locationM
}()
lazy var geoCoder: CLGeocoder = {
return CLGeocoder()
}()
override func viewDidLoad() {
super.viewDidLoad()
_ = locationM
let item = MKUserTrackingBarButtonItem(mapView: mapView)
navigationItem.leftBarButtonItem = item
}
// 理论基础
// 在地图上操作大头针, 实际上操作的是大头针"数据模型"
// 删除大头针: 移除大头针数据模型
// 添加大头针: 添加一个大头针数据模型
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
// 1. 获取当前点击的位置, 对应的经纬度信息
let point = touches.first?.locationInView(mapView)
// 把点 转换成为对应的经纬度坐标
let coordinate = mapView.convertPoint(point!, toCoordinateFromView: mapView)
// 2. 直接调用自定义方法添加
let annotation = addAnnotation(coordinate, title: "美女", subTitle: "约吗")
// 反地理编码的代码
let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
geoCoder.reverseGeocodeLocation(location) { (pls: [CLPlacemark]?, error: NSError?) -> Void in
if error == nil {
let pl = pls?.first
print(pl)
annotation.title = pl?.locality
annotation.subtitle = pl?.name
}
}
}
func addAnnotation(coordinate: CLLocationCoordinate2D, title: String, subTitle: String) -> XMGAnnotation {
// 1, 创建一个大头针数据模型
let annotation: XMGAnnotation = XMGAnnotation()
annotation.coordinate = coordinate
annotation.title = title
annotation.subtitle = subTitle
// 2. 添加大头针数据模型, 到地图上
mapView.addAnnotation(annotation)
return annotation
}
}
extension ViewController: MKMapViewDelegate {
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
// 拿到数据模型
let annotation = view.annotation
print("选中了(annotation?.title)")
}
func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
// 拿到数据模型
let annotation = view.annotation
print("取消选中了(annotation?.title)")
}
func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) {
}
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
// 自定义大头针
// 如果想要自定义大头针, 要不使用 MKAnnotationView, 或者是自己定义的子类
let iden = "item"
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(iden)
if annotationView == nil {
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: iden)
}
// 非常重要的步骤
annotationView?.annotation = annotation
// 设置打头针的图片
annotationView?.image = UIImage(named: "category_5")
// 设置大头针中心偏移量
annotationView?.centerOffset = CGPointMake(0, 0)
// 设置弹框
annotationView?.canShowCallout = true
// 设置弹框的偏移量
annotationView?.calloutOffset = CGPointMake(-10, 10)
// 设置弹框的左侧视图
let imageView = UIImageView(frame: CGRectMake(0, 0, 40, 40))
let image = UIImage(named: "htl.jpg")
imageView.image = image
annotationView?.leftCalloutAccessoryView = imageView
// 设置弹框的右侧视图
let imageView2 = UIImageView(frame: CGRectMake(0, 0, 40, 40))
let image2 = UIImage(named: "eason.jpg")
imageView2.image = image2
annotationView?.rightCalloutAccessoryView = imageView2
// 设置下部弹框
if #available(iOS 9.0, *) {
annotationView?.detailCalloutAccessoryView = UISwitch()
}
// 设置大头针可以拖动
annotationView?.draggable = true
return annotationView
}
/**
如果当我们添加一个大头针数据模型, 到地图上, 那么地图就会自动调用一个代理方法, 来查找对应的大头针"视图!!!!"
- parameter mapView: 地图
- parameter annotation: 大头针"数据模型"
- returns: 大头针"视图"
// 注意事项: 如果这个方法没有实现, 或者返回Nil, 那么就会使用系统默认的大头针视图来显示
*/
func mapView2(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
// 系统大头这视图对应的类 MKPinAnnotationView
// 大头针视图和cell一样, 都有一个"循环利用"机制
// 1. 从缓存池取出大头针视图
let iden = "item"
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(iden) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: iden)
}
// 显示弹框
annotationView?.canShowCallout = true
// 设置大头针颜色
// annotationView?.pinColor = .Green
if #available(iOS 9.0, *) {
annotationView?.pinTintColor = UIColor.blackColor()
} else {
// Fallback on earlier versions
}
// 设置下落动画
annotationView?.animatesDrop = true
print("test")
return annotationView
}
}