Swift MapKit自定义当前位置标记

时间:2016-08-19 19:44:44

标签: ios swift location mapkit

这就是我project目前的样子。我的问题是,如何将蓝球(当前位置)更改为自定义图片图标

2 个答案:

答案 0 :(得分:14)

我相信您知道用户习惯将蓝点视为当前用户的位置。除非你有充分的理由,否则你不应该改变它。

以下是如何更改它:

设置mapView的委托,然后覆盖以下函数......如下所示:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation {
        let pin = mapView.view(for: annotation) as? MKPinAnnotationView ?? MKPinAnnotationView(annotation: annotation, reuseIdentifier: nil)
        pin.pinTintColor = UIColor.purple
        return pin

    } else {
        // handle other annotations

    }
    return nil
}

并显示图像: 只需使用以下代码替换if语句中的代码:

let pin = mapView.view(for: annotation) as? MKPinAnnotationView ?? MKPinAnnotationView(annotation: annotation, reuseIdentifier: nil)
pin.image = UIImage(named: "user_location_pin")
return pin

我认为此代码示例应该为您提供足够的信息,以帮助您弄清楚该怎么做。 (请注意,mapView是在故事板中创建的......)

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate {
    @IBOutlet weak var mapView: MKMapView!

    let loc = CLLocationManager()
    var angle = 0
    var timer: NSTimer!
    var userPinView: MKAnnotationView!

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.delegate = self
        loc.requestWhenInUseAuthorization()

        timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: #selector(rotateMe), userInfo: nil, repeats: true)
    }

    func rotateMe() {
        angle = angle + 10
        userPinView?.transform = CGAffineTransformMakeRotation( CGFloat( (Double(angle) / 360.0) * M_PI ) )

    }

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKUserLocation {
            let pin = mapView.viewForAnnotation(annotation) ?? MKAnnotationView(annotation: annotation, reuseIdentifier: nil)
            pin.image = UIImage(named: "userPinImage")
            userPinView = pin
            return pin

        } else {
            // handle other annotations

        }
        return nil
    }
}

答案 1 :(得分:2)

您可以使用MKMapDelegate的方法自定义视图:

optional func mapView(_ mapView: MKMapView,
    viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
  

<强>参数

     

mapView - 请求注释视图的地图视图。

     

注释 - 表示即将显示的注释的对象。除了自定义注释外,还有此对象   可以是表示用户当前的MKUserLocation对象   位置。

查看完整文档here

另请参阅以下SO问题,以便在用户位置更改时更新视图: Custom Annotation view for userlocation not moving the mapview