我已经构建了一个在地图上显示设施和用户的应用。设施和用户都是自定义注释(我已经扩展MKPointAnnotation
)。我还为注释的类型启用了标注,左右标注附件视图。这些对象的地理数据和其他元数据在后台从我的Parse数据库加载。我在许多地方看到过一条建议,说你应该加载viewDidLoad()
中的所有注释。虽然这似乎是合理的,但我想知道这是否是正确的方法,我想快速加载并显示用户当前区域的内容。
我目前的做法是:根据用户的当前位置在viewDidLoad()
中加载一组注释。在我的MapD委托的regionDidChange方法中,我执行搜索,删除所有注释并再次添加它们。这在很大程度上有效,但偶尔我会将设施的附件视图分配给用户的注释。我已多次检查所有内容,似乎与时间有关,当用户在添加/显示注释时平移地图时发生。它不会在调试器中发生。我怀疑,当用户更改他/她的区域时,我会重新加载注释。
我想获得一些反馈,如果我从根本上不正确地加载注释,我应该如何对其进行建模,以便在用户移动位置或平移地图时动态加载/显示注释。我已经看到Redfin加载属性作为用户平移地图,但我不知道他们是否有多种类型的自定义注释。
感谢您的帮助!
拉杰什
答案 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)
}
}