• [Swift通天遁地]一、超级工具-(9)在地图视图MKMapView中添加支持交互动作的标注图标


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10146034.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    目录:[Swift]通天遁地Swift

    本文将演示在地图视图MKMapView中添加支持交互动作的标注图标。

    在【Assets.xcassets】中导入一张图片【Annotation】,作为自定义的标注图标。

    在项目导航区,打开视图控制器的代码文件【ViewController.swift】

      1 import UIKit
      2 //在当前的类文件中引入所需的类库
      3 import MapKit
      4 //给当前的类添加一个地图视图的代理协议MKMapViewDelegate
      5 class ViewController: UIViewController, MKMapViewDelegate {
      6     
      7     //添加一个标注变量,作为当前类的属性
      8     var selectedAnnotion : MKAnnotation!
      9 
     10     override func viewDidLoad() {
     11         super.viewDidLoad()
     12         // Do any additional setup after loading the view, typically from a nib.
     13         
     14         //初始化一个地图视图,并使地图视图的显示区域,和设备的屏幕尺寸相同
     15         let mapView = MKMapView(frame: self.view.bounds)
     16         //设置地图的代理对象为当前的视图控制器对象
     17         mapView.delegate = self
     18         //设置地图的类型为标准类型
     19         mapView.mapType = MKMapType.standard
     20         
     21         //初始化一个地理坐标,使地图加载该坐标位置上的地理信息
     22         let coordinate2D = CLLocationCoordinate2D(latitude: 39.915352, longitude: 116.397105)
     23         //根据地理坐标,初始化一个地理区域,并设置缩放比例
     24         let region = MKCoordinateRegionMake(coordinate2D, MKCoordinateSpanMake(0.02, 0.02))
     25         //设置地图的显示区域
     26         mapView.setRegion(region, animated: true)
     27         
     28         //初始化一个点标注对象
     29         let objectAnnotation = MKPointAnnotation()
     30         //设置点标注对象地理坐标
     31         objectAnnotation.coordinate = coordinate2D
     32         //设置点标注对象的标题文字
     33         objectAnnotation.title = "Imperial Palace"
     34         //设置点标注对象的子标题的文字内容
     35         objectAnnotation.subtitle = "The world's top five palace"
     36         //将标注对象添加到地图视图
     37         mapView.addAnnotation(objectAnnotation)
     38         
     39         //将地图视图添加到当前视图控制器的根视图
     40         self.view.addSubview(mapView)
     41     }
     42     
     43     //添加一个代理方法,用来设置并返回标注视图
     44     func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
     45     {
     46         //标注视图同表格视图相似,也是采用相同的复用机制。
     47         //在此设置一个标识符,作为标注视图的复用标识。
     48         let identifier = "annotationView"
     49         //从地图视图中,获取一个具有相同标识符的,并且可被复用的标注视图。
     50         var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
     51         
     52         //如果没有可被复用的标注视图,
     53         if annotationView == nil
     54         {
     55             //则初始化一个新的标注视图
     56             annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
     57         }
     58         
     59         //初始化一个信息类型的按钮控件,当用户点击该按钮时,将弹出一个警告窗口
     60         let button = UIButton(type: UIButtonType.infoDark)
     61         //给按钮控件绑定点击事件
     62         button.addTarget(self, action: #selector(ViewController.showInfo), for: .touchUpInside)
     63         //设置标注视图左侧的附加视图
     64         annotationView?.leftCalloutAccessoryView = button
     65         //选择项目中导入的图片文件,作为标注视图的标注图片
     66         annotationView?.image = UIImage(named: "Annotation")
     67         
     68         //设置处于焦点状态的标注视图
     69         self.selectedAnnotion = annotation;
     70         //允许标注视图打开气泡,以显示额外的信息。
     71         annotationView?.canShowCallout = true
     72         
     73         //最后返回设置好的标注视图
     74         return annotationView
     75     }
     76     
     77     //添加一个方法,用来响应按钮的点击事件
     78     func showInfo(sender : UIButton)
     79     {
     80         //初始化一个字符串常量,作为弹出窗口的信息内容。
     81         let message = "Imperial Palace, China and the world's most complete preservation, the largest wooden structure of ancient buildings."
     82         
     83         //初始化一个警告弹出窗口,并设置弹出窗口的标题和主题内容。
     84         let alertView = UIAlertController(title: self.selectedAnnotion.title!, message: message, preferredStyle: UIAlertControllerStyle.alert)
     85         //创建一个默认样式的按钮,
     86         let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil)
     87         //并将按钮添加到弹出窗口中,当点击该按钮时,关闭弹出窗口。
     88         alertView.addAction(OKAction)
     89         
     90         //最后在当前的视图控制器中,弹出警告窗口。
     91         self.present(alertView, animated: true, completion: nil)
     92     }
     93     
     94     //添加一个代理方法,用来监听标注视图被添加到地图视图中的事件
     95     func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView])
     96     {
     97         //遍历所有被添加到地图视图中的标注视图,
     98         for view in views
     99         {
    100             //并在控制台输出其坐标信息
    101             print("Did add one MKAnnotationView:"+((view.annotation?.title)!)!)
    102         }
    103     }
    104     
    105     //添加一个代理方法,用来监听标注视图处于选择状态时的事件。
    106     func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
    107     {
    108         //当选中某个标注视图时,在控制台输出相关的坐标、标题、子标题等信息。
    109         print(view.annotation?.coordinate)
    110         print(view.annotation?.title)
    111         print(view.annotation?.subtitle)
    112     }
    113     
    114     override func didReceiveMemoryWarning() {
    115         super.didReceiveMemoryWarning()
    116         // Dispose of any resources that can be recreated.
    117     }
    118 }
  • 相关阅读:
    JVM源码分析之Object.wait/notify(All)完全解读
    进程无故消失的破案历程
    Jmeter——JDBC Connection Configuration参数化
    Jmeter——CSV DataSet Config参数化
    WeTest明星工具-移动端性能测试PerfDog初探
    基于appium实现的线性代码引用unittest单元测试框架
    Requests实践详解
    Appium-Server与Appium-Desktop的区别
    Appium Python API 中文版
    单元测试框架Uinttest一文详解
  • 原文地址:https://www.cnblogs.com/strengthen/p/10146034.html
Copyright © 2020-2023  润新知