2015-04-21 14 views
10

Làm cách nào để có thể sử dụng MapKit trong Swift, để người dùng kéo chú thích từ vị trí này sang vị trí khác trong bản đồ? Tôi đã đặt ra xem chú thích để có thể kéo, khi tôi xem bản đồ đại biểu tạo chế độ xem chú thích, như thế này:iOS Swift MapKit tạo chú thích có thể kéo được bởi người dùng?

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    var v : MKAnnotationView! = nil 
    if annotation is MyAnnotation { 
     let ident = "bike" 
     v = mapView.dequeueReusableAnnotationView(withIdentifier:ident) 
     if v == nil { 
      v = MyAnnotationView(annotation:annotation, reuseIdentifier:ident) 
     } 
     v.annotation = annotation 
     v.isDraggable = true 
    } 
    return v 
} 

Kết quả là người dùng có thể loại kéo chú thích - nhưng chỉ một lần. Sau đó, chú thích sẽ không thể kéo và thậm chí tệ hơn nữa, chú thích giờ đây không còn "thuộc" để ánh xạ nữa - khi bản đồ được cuộn/quét, chú thích vẫn giữ nguyên hơn là cuộn/di chuyển với bản đồ. Tôi đang làm gì sai?

Trả lời

17

Không đủ để đánh dấu chế độ xem chú thích bằng cách đặt isDraggable thành true. Bạn cũng phải triển khai mapView(_:annotationView:didChange:fromOldState:) trong giao diện bản đồ của mình - và (thậm chí quan trọng hơn) việc triển khai này không được để trống! Thay vào đó, thực hiện của bạn phải, ở mức tối thiểu, trao đổi tình trạng kéo từ các thông số đến để xem chú thích, như thế này:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) { 
    switch newState { 
    case .starting: 
     view.dragState = .dragging 
    case .ending, .canceling: 
     view.dragState = .none 
    default: break 
    } 
} 

Khi bạn làm điều đó, chú thích sẽ được đúng cách có thể kéo bởi người sử dụng.

(Rất cám ơn đến this answer cho việc giải thích này rất rõ ràng. Tôi không thể khẳng định bất kỳ tín dụng! Câu trả lời của tôi ở đây chỉ đơn thuần là một bản dịch của mã vào Swift.)

+0

là giải pháp này vẫn được áp dụng (iOS 11)? Tôi đã làm theo giải pháp, nhưng phương thức 'mapView (_: annotationView: didChange: fromOldState:)' không bao giờ được gọi. – mert

Các vấn đề liên quan