美文网首页
Swift Makit自定义大头针

Swift Makit自定义大头针

作者: 越天高 | 来源:发表于2020-05-04 20:44 被阅读0次
 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

相关文章

网友评论

      本文标题:Swift Makit自定义大头针

      本文链接:https://www.haomeiwen.com/subject/sgkeghtx.html