gpt4 book ai didi

iOS Swift MapKit 为什么 MKPointAnnotation 是可拖动的,而符合 MKAnnotation 的类则不可拖动

转载 作者:行者123 更新时间:2023-11-30 13:11:39 26 4
gpt4 key购买 nike

我有一个类,它是 NSManagedObject 的子类,符合 MKAnnotation然后我在 MapView 中使用它使 CoreData 中的一些位置出列

class Location: NSManagedObject , MKAnnotation {

var coordinate : CLLocationCoordinate2D {
return CLLocationCoordinate2D(latitude: Double(self.latitude), longitude: Double(self.longitude))
}

var title: String? {
return self.name
}

var subtitle: String? {
return self.category
}
}

然后我将获取的对象添加到 MapViewMKAnnotation像这样

self.MapView.addAnnotations(self.locations)

以及viewForAnnotation我做了 MKAnnotationView 的子类有一个圆形的 imageView

class AMKAnnotationView: MKAnnotationView {

var imageView = UIImageView()

init(annotation: MKAnnotation?, reuseIdentifier: String?, size: CGSize) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
self.frame = CGRectMake(0, 0, size.width, size.height)
self.commonInit()
}

override init(frame: CGRect) {
super.init(frame: frame)
}

required init?(coder: NSCoder) {
super.init(coder: coder)
}

func commonInit() {
self.imageView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height)
self.imageView.layer.masksToBounds = true
self.imageView.layer.cornerRadius = self.imageView.frame.height/2
self.imageView.layer.borderWidth = 5.0
self.imageView.layer.borderColor = UIColor.whiteColor().CGColor
self.imageView.userInteractionEnabled = false
self.addSubview(imageView)
self.sendSubviewToBack(self.imageView)
}

}

然后我设置了annotationView成为draggableviewForAnnotation

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

var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("pin") as? AMKAnnotationView

if annotationView == nil {
annotationView = AMKAnnotationView(annotation: annotation, reuseIdentifier: "pin", size: CGSizeMake(65, 65))
annotationView?.draggable = true
annotationView?.canShowCallout = true

let index = ... // i get the index
let location = ... // i get the current location

annotationView?.imageView.image = UIImage(named: "No Photo")

}

return annotationView
}

使annotationView成为draggable我们应该实现didChangeDragState委托(delegate)方法

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {

switch newState {
case .Starting:
view.dragState = .Dragging
case .Ending, .Canceling:
view.dragState = .None
// then i save the changes to CoreData
}
default: break
}
}

如果我尝试在 map 上拖动注释,它不起作用

* 我不喜欢的解决方案 *

按照这个问题的标题所述,我让它工作的方式是使用 MKPointAnnotation我的意思是每次我向 map 添加注释时我都会转换为 MKPointAnnotation这让我创建了 MKPointAnnotation 的另一个子类这样我就可以跟踪位置

class AMKPointAnnotation : MKPointAnnotation {

var location : Location!

init(location:Location) {
super.init()
self.location = location
self.title = location.title
self.subtitle = location.subtitle
self.coordinate = location.coordinate
}

}

然后将其添加到 MapView

for location in self.locations {
let pointAnnotation = AMKPointAnnotation(location: location)
self.MapView.addAnnotation(pointAnnotation)
}

有人尝试过吗?我做错了什么?

最佳答案

坐标属性会随着拖动而改变,并且它必须是读/写的,并且由于它是一个没有 setter 的计算属性,MapKit 阻止了拖动

*这是解决方案*

class Location: NSManagedObject , MKAnnotation {

var coordinate : CLLocationCoordinate2D {
set {
self.latitude = newValue.latitude
self.longitude = newValue.longitude
}
get {
return CLLocationCoordinate2D(latitude: Double(self.latitude), longitude: Double(self.longitude))
}
}

var title: String? {
return self.name
}

var subtitle: String? {
return self.category
}
}

关于iOS Swift MapKit 为什么 MKPointAnnotation 是可拖动的,而符合 MKAnnotation 的类则不可拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38663019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com