20032


swift2.1を使ってannotationをカスタマイズして画像を貼ろうと思っていますが、サンプルプログラムを実行してもMKCircleは出るんですが、ピンとカスタマイズした画像が表示されません。  
swift2.1になって何か変更点が出て実行できないのでしょうか？

[![スクリーンショット](https://i.stack.imgur.com/uDP1o.jpg)](https://i.stack.imgur.com/uDP1o.jpg)

[007 アノテーションに画像を追加-swift Docs](https://sites.google.com/a/gclue.jp/swift-
docs/ni-yinki100-ios/7-mapkit/anoteshonni-hua-xiangwo-zhui-jia)

[code]

    import UIKit
    import MapKit
    
    class ViewController: UIViewController, MKMapViewDelegate {
    
        // 経度緯度.
        let myLan: CLLocationDegrees = 37.331741
        let myLon: CLLocationDegrees = -122.030333
    
        var center: CLLocationCoordinate2D!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // 地図の中心の座標.
            center = CLLocationCoordinate2DMake(myLan, myLon)
    
            // mapViewを生成.
            var myMapView: MKMapView = MKMapView()
            myMapView.frame = self.view.frame
            myMapView.center = self.view.center
            myMapView.centerCoordinate = center
            myMapView.delegate = self
    
            // 縮尺を指定.
            let mySpan: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
            let myRegion: MKCoordinateRegion = MKCoordinateRegion(center: center, span: mySpan)
    
            // regionをmapViewに追加.
            myMapView.region = myRegion
    
            // viewにmapViewを追加.
            self.view.addSubview(myMapView)
    
            // 円を描画する(半径500m).
            let myCircle: MKCircle = MKCircle(centerCoordinate: center, radius: CLLocationDistance(500))
    
            // mapViewにcircleを追加.
            myMapView.addOverlay(myCircle)
    
            // centerを指すアノテーションを生成.
            let myPointAnnotation: MKPointAnnotation = MKPointAnnotation()
            myPointAnnotation.title = "title"
            myPointAnnotation.subtitle = "subtitle"
            myPointAnnotation.coordinate = center
    
            // mapViewにアノテーションを追加.
            myMapView.addAnnotation(myPointAnnotation)
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        /*
        addAnnotationした際に呼ばれるデリゲートメソッド.
        */
        func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    
            // Identifier生成.
            let myAnnotationIdentifier: NSString = "myAnnotation"
    
            // アノテーション生成.
            var myAnnotationView: MKAnnotationView!
    
            // もしアノテーションがまだインスタンス化されていなかったらインスタンスを生成する.
            if myAnnotationView == nil {
    
                myAnnotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: myAnnotationIdentifier as String)
    
                // アノテーションに画像を追加.
                myAnnotationView.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "sample.jpg"))
    
                // アノテーションのコールアウトを許可.
                myAnnotationView.canShowCallout = true
            }
    
            return myAnnotationView
        }
    
        /*
        addOverlayした際に呼ばれるデリゲートメソッド.
        */
        func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    
            // rendererを生成.
            let myCircleView: MKCircleRenderer = MKCircleRenderer(overlay: overlay)
    
            // 円の内部を青色で塗りつぶす.
            myCircleView.fillColor = UIColor.blueColor()
    
            // 円を透過させる.
            myCircleView.alpha = 0.5
    
            // 円周の線の太さ.
            myCircleView.lineWidth = 0.5
    
            return myCircleView
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-15T07:03:36.627
20014
2015-12-16T15:09:21.153
8044
question
ios swift
swift2.1でマップアプリのaddAnnotationした際に呼ばれるデリゲートメソッド


Objective-C側のAPIに`nullable`/`nonnull`が追加されたことで、iOS9
SDKでは`!`のついていた多くのAPIが変更されています。

実際にコードを書くと警告が出ると思うのですが、以下の通りに修正する必要があります。

[code]

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    
        // 現在地を示すアノテーションではnilを返却し、規定の挙動にする
        if annotation is MKUserLocation {
            return nil
        }
    
        // Identifier
        let myAnnotationIdentifier = "myAnnotation"
    
        // AnnotationViewをdequeue
        var myAnnotationView : MKAnnotationView! = mapView.dequeueReusableAnnotationViewWithIdentifier(myAnnotationIdentifier)
    
        if myAnnotationView == nil {
            myAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: myAnnotationIdentifier)
            myAnnotationView.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "sample.jpg"))
            myAnnotationView.canShowCallout = true
        }
    
        return myAnnotationView
    }
    
[/code]

これはサンプルコードになぜか書いていないので補足になりますが、

  * `MKAnnotationView`は`dequeueReusableAnnotationViewWithIdentifier:`を利用しないと再利用できません。（毎回`View`を生成することになり、`identifier`の意味もありません）
  * ただの`MKAnnotationView`はサブクラスで独自にアノテーションを作る場合に使うものなので、ピンを表示するのであれば`MKPinAnnotationView`を使う必要があります。


CC BY-SA 3.0
2015-12-15T13:58:26.237
20032
2015-12-16T15:09:21.153
2015-12-16T15:09:21.153
5337
5337
20014
answer