web-dev-qa-db-ja.com

Swift-MKAnnotationViewをMKMapViewに追加

MKAnnotationViewMKMapViewに追加しようとしていますが、できません...誰か助けてもらえますか?

ここに私のコードがあります:

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.startUpdatingLocation()
    var latitude:CLLocationDegrees = locationManager.location.coordinate.latitude
    var longitude:CLLocationDegrees = locationManager.location.coordinate.longitude
    var homeLati: CLLocationDegrees = 40.01540192
    var homeLong: CLLocationDegrees = 20.87901079
    var latDelta:CLLocationDegrees = 0.01
    var longDelta:CLLocationDegrees = 0.01
    var theSpan:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
    var myHome:CLLocationCoordinate2D = CLLocationCoordinate2DMake(homeLati, homeLong)
    var myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
    var theRegion:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, theSpan)
    self.theMapView.setRegion(theRegion, animated: true)
    self.theMapView.mapType = MKMapType.Hybrid
    self.theMapView.showsUserLocation = true
    ///Red Pin
    var myHomePin = MKPointAnnotation()
    myHomePin.coordinate = myHome
    myHomePin.title = "Home"
    myHomePin.subtitle = "Bogdan's home"
    self.theMapView.addAnnotation(myHomePin)

    var anView:MKAnnotationView = MKAnnotationView()
    anView.annotation = myHomePin
    anView.image = UIImage(named:"xaxas")
    anView.canShowCallout = true
    anView.enabled = true
}
24
Bogdan Bogdanov

viewForAnnotationデリゲートメソッドを実装し、そこからMKAnnotationViewを返す必要があります。

以下に例を示します。

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    if (annotation is MKUserLocation) {
        //if annotation is not an MKPointAnnotation (eg. MKUserLocation),
        //return nil so map draws default view for it (eg. blue dot)...
        return nil
    }

    let reuseId = "test"

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil {
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        anView.image = UIImage(named:"xaxas")
        anView.canShowCallout = true
    }
    else {
        //we are re-using a view, update its annotation reference...
        anView.annotation = annotation
    }

    return anView
}

独自のカスタムイメージを使用する場合は、plainMKAnnotationViewを作成する必要があることに注意してください。 MKPinAnnotationViewは、標準のピン注釈にのみ使用する必要があります。

また、startUpdatingLocationを呼び出した直後にlocationManager.locationにアクセスしないでください。まだ準備ができていない可能性があります。

didUpdateLocationsデリゲートメソッドを使用します。

また、requestAlwaysAuthorization/requestWhenInUseAuthorizationを呼び出す必要があります( iOS 8で動作しない位置情報サービス を参照)。

37
user467105

1-マップビューは、View Controllerに自分自身を委任する必要があります2-実装する必要があります

func mapView(aMapView: MKMapView!, viewForAnnotation annotation: CustomMapPinAnnotation!) -> MKAnnotationView!

この関数は、マップに追加されたすべての注釈から呼び出されます

3- viewForAnnotationメソッドでアノテーションを識別するためにアノテーションをサブクラス化します

4- viewForAnnotationで、追加

if annotation.isKindOfClass(CustomMapPinAnnotation)
{
  // change the image here
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? YourSubclassedAnnotation
  pinView!.image = UIImage(contentsOfFile: "xyz")
}
0
user3766852

注釈を表示する必要があります。次に、注釈の表示メソッドを追加する必要があります。

let annotation = MKPointAnnotation()
mapVew.showAnnotations([annotation], animated: true)

annotationMKPointAnnotationのインスタンスです。

0
Abhishek Mishra