2

この問題の解決策を見つけるのは非常にイライラします。問題を理解するためにコード全体を投稿しました。助けてください

import UIKit
import MapKit
import CoreLocation
class LocationViewController: UIViewController,MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()
    var annotationPoint: MKPointAnnotation!
    var getMovedMapCenter: CLLocation!
    var myPinView:MKPinAnnotationView!
    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        if #available(iOS 8.0, *) {
            self.locationManager.requestWhenInUseAuthorization()
        } else {
            // Fallback on earlier versions
        }
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

        // Do any additional setup after loading the view.
    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations.last

        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

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

        self.mapView.setRegion(region, animated: true)

        if(self.annotationPoint == nil)
        {
            self.annotationPoint = MKPointAnnotation()
            getMovedMapCenter =  CLLocation(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

             self.annotationPoint.coordinate = getMovedMapCenter.coordinate

            // self.annotationPoint.title = location_value
            //self.annotationPoint.subtitle = ""

            // println_debug(self.annotationPoint)

            self.mapView.addAnnotation(self.annotationPoint)

        }

        self.locationManager.stopUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
    {
        print("Errors: " + error.localizedDescription)
    }

    //MARK:- View for Annotation
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
    {
        if annotation is MKPointAnnotation {
            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")

            pinAnnotationView.pinColor = .Purple
            pinAnnotationView.draggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true

            return pinAnnotationView
        }

        return nil
    }

    //MARK:- Annotation Changed State

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

        print("hiii")


        //        println_debug("End State coordinates: \(self.annotationPoint.coordinate.latitude),\(self.annotationPoint.coordinate.longitude)")


        if(newState == .Ending)
        {


            let center = CLLocationCoordinate2D(latitude: self.annotationPoint.coordinate.latitude, longitude: self.annotationPoint.coordinate.longitude)
            //    self.currentLocationNameA(center)

            //            dispatch_async(GlobalBackgroundQueue)
            //                {
            //
            //
            //            }
        }

    }

    //MARK:- update Not Get

    func mapView(mapView: MKMapView,
        didFailToLocateUserWithError error: NSError)
    {
        // AppHelper.showALertWithTag(121, title: APP_NAME, message: "Failed to get location. Please check Location setting", delegate: nil, cancelButtonTitle: "Ok", otherButtonTitle: nil)

    }




}

このコードにはまりました。didChangeDragState デリゲートが呼び出されなかったためです。これに対するより良い解決策を見つけるのを手伝ってください。私は迅速に慣れていません。したがって、目的のCコードを迅速に変換するのは難しい

4

3 に答える 3

2

ドラッグ状態は通常、注釈ビューに対するユーザーの操作に応じて変化します。ただし、注釈ビュー自体もその状態を変更する責任があります。

このメソッドを置き換えて、一度試してください。うまくいっているかもしれません

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
    default: break
    }
}

ポイントアノテーションメソッドをこれに置き換えます。

let pa = MKPointAnnotation()
pa.coordinate = placemark.location.coordinate
pa.title = placemark.name //or whatever title you like
self.mapView.addAnnotation(pa)

詳細については、コード別のサンプル コードを参照してください。

于 2015-10-19T09:25:48.070 に答える
1
 pinAnnotationView.canShowCallout = false

この行は私の問題を解決します。「現在地」を表示するポップアップがこの問題の主な原因でした。

これらのコードの変更により、ドラッグがスムーズになります。Mehul と Vijay Answer は、この解決策を見つけるのに役立ちます。

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
        switch (newState) {
        case .Ending, .Canceling:
            view.dragState = .None
        default: break
        }
    }
于 2015-10-19T10:37:11.540 に答える
0
   if (annotation is MKUserLocation) {
        return nil
    }

    let reuseId12 = "pin12"

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)

    if pinView == nil {
        pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId12)
        pinView.image = UIImage(named:"pin-1250.png")
        pinView.canShowCallout = false
        pinView.draggable = true
    }
    else {

        pinView.annotation = annotation
    }

    return pinView

このコードを試してください。

于 2015-10-19T09:20:55.230 に答える