lazy var geoCode : CLGeocoder =
{
let code = CLGeocoder()
return code
}()
// 理论基础
// 在地图上操作大头针, 实际上操作的是大头针"数据模型"
// 删除大头针: 移除大头针数据模型
// 添加大头针: 添加一个大头针数据模型
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
//1. 根据当前的点的位置 获得在地图上面的坐标
let point = touches.first?.location(in: mapkitView)
//经纬度
let coordinate = mapkitView.convert(point!, toCoordinateFrom: mapkitView)
//2.创建一个大头针
let userAnnotation = addAnnotaton(cooridate: coordinate, title: "gdage", subTitle: "好帅")
//反地理编码 取得位子信息
geoCode.reverseGeocodeLocation(CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude))
{ (places, error) in
if error == nil
{
let mark = places?.first
userAnnotation.title = mark?.locality
userAnnotation.subtitle = mark?.name
self.mapkitView.addAnnotation(userAnnotation)
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
//获取所有大头针的模型
let annotataions = mapkitView.annotations
//2. 移除
mapkitView.removeAnnotations(annotataions)
}
//创建一个大头针的快捷方法
func addAnnotaton( cooridate : CLLocationCoordinate2D , title : String , subTitle : String) -> UserAnnotation
{
//创建一个大头针数据模型
let userAnnotation : UserAnnotation = UserAnnotation()
userAnnotation.title = title
userAnnotation.subtitle = subTitle
userAnnotation.coordinate = cooridate
//添加到地图上面
return userAnnotation
}
}
//MARK: - MKMapViewDelegate -
extension ViewController : MKMapViewDelegate
{ // 当地图更新用户位置信息时, 调用的方法
// 蓝点: 大头针"视图" 大头针"数据模型"
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)
{
}
/**
如果当我们添加一个大头针数据模型, 到地图上, 那么地图就会自动调用一个代理方法, 来查找对应的大头针"视图!!!!"
- parameter mapView: 地图
- parameter annotation: 大头针"数据模型"
- returns: 大头针"视图"
// 注意事项: 如果这个方法没有实现, 或者返回Nil, 那么就会使用系统默认的大头针视图来显示
*/
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
// 系统大头这视图对应的类 MKPinAnnotationView
// 大头针视图和cell一样, 都有一个"循环利用"机制
// 1. 从缓存池取出大头针视图
let identifier = "item"
//1. 大头针系统对应的视图是 MKPinAnnotationView,它继承自 MKAnnotationView
//2. 地图上的大头针视图,和tableview上的cell一样,都使用“循环利用”的机制
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as! MKPinAnnotationView?
if annotationView == nil
{
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
}
//显示弹框
annotationView?.canShowCallout = true
//设置大头针的颜色
annotationView?.pinTintColor = UIColor.blue
// 设置下落动画
annotationView?.animatesDrop = true
return annotationView
}
}
- 使用自定义的view需要使用 MKAnnotationView, 或者是自己定义的子类
let identifier = "item"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
if annotationView == nil
{
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
}
//非常重要的步骤
annotationView?.annotation = annotation
//设置大头针的图片
annotationView?.image = UIImage(named: "category_1")
// 设置大头针中心偏移量(就是大头针相对于你点的位子移动,默认的是中心)
annotationView?.centerOffset = CGPoint.zero
//设置弹框
annotationView?.canShowCallout = true
//设置弹框的偏移量,显示信息的View
annotationView?.calloutOffset = CGPoint(x: 0, y: 0)
//左边辅助试图
let leftImageView = UIImageView(frame: CGRect(x: 10, y: 0, width: 80, height: 40))
leftImageView.backgroundColor = UIColor.systemPink
annotationView?.leftCalloutAccessoryView = leftImageView
// 设置右边AccessoryView
let rightImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 80, height: 70))
rightImageView.backgroundColor = UIColor.systemPink
annotationView?.rightCalloutAccessoryView = rightImageView
if #available(iOS 9.0, *)
{
let detailImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
detailImageView.backgroundColor = UIColor.orange
annotationView?.detailCalloutAccessoryView = UISwitch()
}
annotationView?.dragState = .dragging
return annotationView
网友评论