web-dev-qa-db-ja.com

iOS 9でMapKitがカスタムの注釈ピン画像を表示しない

私のコードはiOS 7から8で正常に機能しました。昨日の更新で、私のピンのカスタム画像は標準のピン画像に置き換えられました。助言がありますか?

私のコード:

extension ViewController: MKMapViewDelegate {

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

        if annotation is MKUserLocation {
            return nil
        }

        let reuseId = String(stringInterpolationSegment: annotation.coordinate.longitude)

        var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView

        if pinView == nil {

            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            pinView!.canShowCallout = true
            pinView!.image = getRightImage(annotation.title!!) 
        }

        let button = UIButton(type: UIButtonType.DetailDisclosure) 
        pinView?.rightCalloutAccessoryView = button

        return pinView
    }
}

画像を取得する関数は、名前に基づいてUIImageを返します。

func getRightImage (shopName:String)-> UIImage{

    var correctImage = UIImage()

    switch shopName
    {
    case "Kaisers":
        correctImage = UIImage(named: "Kaisers.jpg")!
    default:
        correctImage = UIImage(named: "sopiconsmall.png")!

    }

    return correctImage
}

いいえ、マップは次のようになります。 ios9 without images

35
Felix Weber

MKPinAnnotationViewを作成する代わりに、プレーンなMKAnnotationViewを作成します。

MKPinAnnotationViewサブクラスは、標準の赤、緑、紫のピンのみを(pinColorプロパティを介して)表示するように設計されているため、imageプロパティを無視する傾向があります。

MKAnnotationViewに切り替えると、そのプロパティはMKPinAnnotationViewに固有であるため、animatesDrop行もコメント化する必要があります。

76

次のコードは、すべてのiOS 6〜iOS 9デバイスで完全に機能します。

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    // create a proper annotation view, be lazy and don't use the reuse identifier
    MKAnnotationView *view = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                reuseIdentifier:@"identifier"];

    // create a disclosure button for map kit
    UIButton *disclosure = [UIButton buttonWithType:UIButtonTypeContactAdd];

    [disclosure addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                             action:@selector(disclosureTapped)]];
    view.rightCalloutAccessoryView = disclosure;

       view.enabled = YES;
       view.image = [UIImage imageNamed:@"map_pin"];


    return view;
}
5
Harshal Wani

Swift 4

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

    if annotation is MKUserLocation {
        return nil
    }

    let reuseId = String(stringInterpolationSegment: annotation.coordinate.longitude)

    var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)

    if pinView == nil {

        pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.image = getRightImage(annotation.title!!) 
    }

    let button = UIButton(type: UIButtonType.DetailDisclosure) 
    pinView?.rightCalloutAccessoryView = button

    return pinView
}
0
Sebastian Esser