iOS加载自定义注释

时间:2017-03-28 20:19:09

标签: ios swift parsing annotations mapkit

我已经构建了一个在地图上显示设施和用户的应用。设施和用户都是自定义注释(我已经扩展MKPointAnnotation)。我还为注释的类型启用了标注,左右标注附件视图。这些对象的地理数据和其他元数据在后台从我的Parse数据库加载。我在许多地方看到过一条建议,说你应该加载viewDidLoad()中的所有注释。虽然这似乎是合理的,但我想知道这是否是正确的方法,我想快速加载并显示用户当前区域的内容。

我目前的做法是:根据用户的当前位置在viewDidLoad()中加载一组注释。在我的MapD委托的regionDidChange方法中,我执行搜索,删除所有注释并再次添加它们。这在很大程度上有效,但偶尔我会将设施的附件视图分配给用户的注释。我已多次检查所有内容,似乎与时间有关,当用户在添加/显示注释时平移地图时发生。它不会在调试器中发生。我怀疑,当用户更改他/她的区域时,我会重新加载注释。

我想获得一些反馈,如果我从根本上不正确地加载注释,我应该如何对其进行建模,以便在用户移动位置或平移地图时动态加载/显示注释。我已经看到Redfin加载属性作为用户平移地图,但我不知道他们是否有多种类型的自定义注释。

感谢您的帮助!

拉​​杰什

2 个答案:

答案 0 :(得分:0)

http://swift3devlopment.blogspot.in/这里有一些你真正需要的东西..

答案 1 :(得分:0)

第1步:创建如下所示的课程

  class custumAnnotation : MKPointAnnotation
    {
        var imgName : String?

    }

第2步:转到Viewcontroller.swift并将代码编写为以下内容

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController,MKMapViewDelegate {

    @IBOutlet var mapView : MKMapView!
    var CLManager = CLLocationManager()
    var flag : Int = 0
     var tag : Int = 0
    override func viewDidLoad() {
        super.viewDidLoad()

        CLManager.requestWhenInUseAuthorization()
        mapView.mapType = .hybridFlyover
        mapView.showsUserLocation = true

        let center = CLLocationCoordinate2D(latitude: 18.4575
            , longitude: 73.8677)

        let center1 = CLLocationCoordinate2D(latitude: 18.5597
            , longitude: 73.7799)
        let point1 = custumAnnotation()
        point1.coordinate = center
        point1.imgName = "1.png"
        point1.title = "First"
        point1.subtitle = "Subtitle1"

        let point2  = custumAnnotation()
        point2.coordinate = center1
        point2.imgName = "2.png"
        point2.title = "Second"
        point2.subtitle = "Subtitle2"

        mapView.addAnnotation(point1)
        mapView.addAnnotation(point2)
        mapView.delegate = self
    }

    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {

        if(flag == 0)
        {
            flag=1
            let userLocation  = userLocation.location?.coordinate

            let center = CLLocationCoordinate2D(latitude: (userLocation?.latitude)!
                , longitude: (userLocation?.longitude)!)

            let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

            mapView.setRegion(region, animated: true)
            mapView.showsUserLocation = false

            let annotation = MKPointAnnotation()
            annotation.coordinate = center
            annotation.title = "ME"
            annotation.subtitle = "CD"
            mapView.addAnnotation(annotation)
        }
    }

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {



        if !(annotation is custumAnnotation) {
            return nil
        }

        let reuseId = "test"

        var anView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
        if anView == nil
        {
            anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            anView?.canShowCallout = true
        }
        else
        {
            anView?.annotation = annotation

        }

        let cpa = annotation as! custumAnnotation
        anView?.image = UIImage(named:cpa.imgName!)
        anView?.tag = tag
        tag = tag + 1
        return anView
    }
    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

        print(view.tag)

    }
}