美文网首页
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