iOS地图MKMapView(一)

这篇文章有以下三个知识点

  • 设置地图类型
  • 在地图上面显示用户位置
  • 设置用户大头针信息
显示地图:

在storyboard中拖个MKMapView或是用代码创建个MKMapView添加到视图中就可以了。
注意import MapKit,不然会报错。

设置地图类型

设置地图类型只需设置MKMapView的mapType属性。

open var mapType: MKMapType // 地图类型

MKMapType是一个结构体

public enum MKMapType : UInt {
case standard //标准类型
case satellite // 卫星类型
case hybrid // 标准和卫星结合的混合类型
}
MKMapType枚举还有一些其他的值,但是目前在中国还没有支持,了解下就可以了。

下面是mapType属性的使用代码和效果图

  @IBOutlet weak var mapView: MKMapView!
    /// 切换segmentController值变化的时候调用这个方法
    ///
    /// - Parameter sender: UISegmentedControl
    @IBAction func segmentControlValueChange(_ sender: UISegmentedControl) {
        
        
        switch sender.selectedSegmentIndex {
        case 0:
            mapView.mapType = .standard // 用标准类型
        case 1:
            mapView.mapType = .satellite // 用卫星类型
        case 2:
            mapView.mapType = .hybrid  // 用标准和卫星混合的类型
        default:
            break
        }
        
    }

标准类型效果图:


Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 14.35.36.png

卫星类型效果图:


Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 14.12.46.png

混合类型效果图:


Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 14.13.17.png
提示:
  1. 卫星类型和混合类型不仔细看的话没太大区别,放大地图看的话会有很大区别

  2. 卫星类型用的比较少,因为看不到城市等信息。

  3. 以上更改地图类型的代码可以简洁为一句

    /// 切换segmentController值变化的时候调用这个方法
    ///
    /// - Parameter sender: UISegmentedControl
    @IBAction func segmentControlValueChange(_ sender: UISegmentedControl) {
        
        mapView.mapType = MKMapType(rawValue: UInt(sender.selectedSegmentIndex))!
        
    }

在地图上面显示用户位置

要显示用户位置,需要两步

  1. 获取用户位置授权
  2. 设置MKMapView的userTrackingMode属性

获取用户位置授权在我之前的文章写过了。浅谈iOS定位,这里就不啰嗦了。

userTrackingMode属性

open var userTrackingMode: MKUserTrackingMode // 用户追踪模式

MKUserTrackingMode是个结构体

public enum MKUserTrackingMode : Int {
case none // 不获取用户位置
case follow // 获取用户位置不显示方向信息
case followWithHeading // 获取用户位置显示方向信息
}

实例代码:

@IBOutlet weak var mapView: MKMapView!
    var manager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 请求用户授权
        manager.requestWhenInUseAuthorization()
         // 获取用户位置不显示方向信息
//        mapView.userTrackingMode = .follow
        // 获取用户位置显示方向信息
        mapView.userTrackingMode = .followWithHeading
    }

mapView.userTrackingMode = .follow的效果图:

Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 14.58.56.png

mapView.userTrackingMode = .followWithHeading的效果图:

Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 14.57.57.png

设置用户大头针信息

没有实现功能前的效果图:

Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 15.07.04.png

实现功能后的效果图:

Simulator Screen Shot - iPhone 8 Plus - 2018-04-12 at 15.08.11.png

代码实现:

    @IBOutlet weak var mapView: MKMapView!
    var manager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 请求用户授权
        manager.requestWhenInUseAuthorization()
        
        // 设置用户追踪模式
        mapView.userTrackingMode = .follow
//        mapView.userTrackingMode = .followWithHeading
        
        mapView.delegate = self
    }

    /// 更新用户位置完成时候调用的MKMapView代理方法
    ///
    /// - Parameters:
    ///   - mapView: MKMapView
    ///   - userLocation: 用户位置属性
    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        
        let geocoder = CLGeocoder()
        
        // 反地理编码
        geocoder.reverseGeocodeLocation(userLocation.location!) { (placemarks: [CLPlacemark]?, error: Error?) in
            
            // 设置用户位置的标题是城市
            userLocation.title = placemarks?.last?.locality
            
            // 设置用户位置的子标题是具体位置
            userLocation.subtitle = placemarks?.last?.name
        }
        
    }

MKUserLocation这个类指的是地图上显示用户当前位置的圆点。设置title和subtitle属性就可以设置用户位置信息。

这个类遵守了MKAnnotation协议,实现了title和subtitle属性。

MKAnnotation协议

public protocol MKAnnotation : NSObjectProtocol {
public var coordinate: CLLocationCoordinate2D { get }. // 经纬度类
optional public var title: String? { get } // 标题
optional public var subtitle: String? { get } // 子标题
}

总结:
设置用户位置知识点只需要两步

  1. 设置代理,实现mapView完成用户位置更新方法。因为实现这个代理方法才能获取MKUserLocation对象
  2. 设置MKUserLocation这个类的title和subtitle属性

以上代码设置用户位置信息知识点涉及到地理编码,如果不熟悉,可以参考笔者之前的iOS地理编码的简单实现

这篇文章就写到这里,希望对你们有帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 现在很多社交、...
    JJO阅读 4,192评论 4 19
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • http://www.cnblogs.com/kenshincui/p/4125570.html 摘要: 现在很多...
    大崔老师阅读 3,329评论 1 2
  • *初学地图时,觉得地图是个很高深的玩意儿,导航、定位、检索这得运用多少算法和核心动画的知识点啊,于是一直排斥 * ...
    柳骏阅读 3,928评论 11 22
  • 地图的基本使用 1.设置地图显示类型// 1.设置地图显示类型 /** MKM...
    Developer_Yancy阅读 4,732评论 3 58