如何在viewcontroller中使用Custom MKAnnotationView

时间:2016-09-15 16:14:02

标签: ios

Swift - Custom MKAnnotationView, set label title

此链接告诉我如何创建自定义注释。我是IoS app的新手。试图了解如何在代码中使用它。 我想更改调用中的字体并且有2行而不是1行。看来这个类可以做到这一切,但我不知道如何在视图控制器中使用它来更改字体。目前,这就是我所拥有的,并按照链接中的建议创建了该类:

let annotation = MKPointAnnotation()
annotation.coordinate = coordinate               
annotation.title=title
self.map.addAnnotation(annotation)

如何更改此选项以使用自定义类?

感谢

拉​​姆

2 个答案:

答案 0 :(得分:0)

  

如何更改此选项以使用自定义类?

您必须了解注释和注释视图之间的区别。前者是与地图的某个点或区域相关联的对象。您可以在地图视图中添加注释,然后地图视图会确定何时需要显示特定注释,这样您就不必担心地图的哪个部分可见,缩放级别是什么如果要在注释本身中存储某种自定义数据,则可以创建MKAnnotation的子类。例如,有一个MKUserAnnotation子类,它添加了heading属性;你可以在你自己的注释子类中做同样的事情。

注释视图提供注释的直观表示。地图视图可以包含数百或数千个注释,但通常只需要在其中显示少数几个注释。当地图视图想要显示注释时,它会调用它的委托mapView(_:viewFor:)方法,并且委托会返回为相关注释配置的相应注释视图。如果您想使用自己的MKAnnotationView子类,正如您的问题标题所示,那么您应该在地图视图委托中实现mapView(_:viewFor:),以便它实例化 * 您的实例自定义MKAnnotationView子类,配置它,然后返回它。

* 在您的地图视图委托实际创建新的注释视图之前,您应该调用地图视图的dequeueReusableAnnotationView(withIdentifier:)方法,该方法可能会返回您可以使用的视图创建一个新的。重用注释视图很像UITableView重用表格单元格的方式;在这两种情况下,我们的想法是避免不断创造和破坏短命的观点。这些都在文档中解释,所以请查看完整的解释。

答案 1 :(得分:0)

您需要实现MKMapView的委托方法:

success_url

您可以在刚开始设置代码时使用MKPointAnnotation,而不是创建自定义注释视图:

import UIKit
import MapKit

extension MapVC: MKMapViewDelegate, CLLocationManagerDelegate
{
    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
    {
        ...
    }

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

        if annotation is MKUserLocation {
            //return nil so map view draws "blue dot" for standard user location
            return nil
        }
        let reuseId = "pin"

        var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
        if pinView == nil {
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            pinView.canShowCallout = true
            pinView.animatesDrop = true
            pinView.pinColor = .Purple
        }
        else {
            pinView!.annotation = annotation
        }
        return pinView
    }
}