質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

Swift マップのピンに吹き出しが出ません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 965

unchi

score 12

前提・実現したいこと

高校生です。今Swifftで自力でマップ関連のアプリを作っています。実現したいこととしましては、マップのピンをタップすることで、吹き出しを出して、その中にボタンをつけることです。現状としては、ピンを立てるところまではできたのですが、吹き出しが出て来ず、困っています。見よう見まねでいろんなサイトから引っ張ってきものです。

発生している問題・エラーメッセージ

エラーメッセージはないです

該当のソースコード

import UIKit
import MapKit
import CoreLocation

class ViewController:   UIViewController,CLLocationManagerDelegate,UIGestureRecognizerDelegate,MKMapViewDelegate{

    var locManager: CLLocationManager!
    var pointAno: MKPointAnnotation = MKPointAnnotation()
    var button: UIButton!

    @IBOutlet var mapView: MKMapView!
    @IBOutlet var longPressGesRec: UILongPressGestureRecognizer!
    @IBOutlet var tapgesture: UITapGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        locManager = CLLocationManager()
        locManager.delegate = self

        // 位置情報の使用の許可を得る
        locManager.requestWhenInUseAuthorization()
        if CLLocationManager.locationServicesEnabled() {
            switch CLLocationManager.authorizationStatus() {
            case .authorizedWhenInUse:
                // 座標の表示
                locManager.startUpdatingLocation()
                break
            default:
                break
            }
        }

        // 地図の初期化
        initMap()

    }

  /*  @IBAction func mapViewDidPress(_ sender: UITapGestureRecognizer) {
      //タップ開始
        if sender.state == .began {
        }
            // タップ終了(手を離した)
        else if sender.state == .ended {
            print("押した")
        }

    }
    */

    @IBAction func tagmemo(_ sender: UILongPressGestureRecognizer) {
        // タップ開始
        if sender.state == .began {
            // タップ開始時に古いピンを削除する
            mapView.removeAnnotation(pointAno)
        }
            // タップ終了(手を離した)
        else if sender.state == .ended {
            // タップした位置(CGPoint)を指定してMkMapView上の緯度経度を取得する
            let tapPoint = sender.location(in: view)
            let center = mapView.convert(tapPoint, toCoordinateFrom: mapView)

            let lonStr = center.longitude.description
            let latStr = center.latitude.description
            print("lon : " + lonStr)
            print("lat : " + latStr)

            // 現在位置とタップした位置の距離(m)を算出する
            let distance = calcDistance(mapView.userLocation.coordinate, center)
            print("distance : " + distance.description)

            if (0 != distance) {
                // ピンに設定する文字列を生成する
                var str:String = Int(distance).description
                str = str + " m"


                if pointAno.title != str {
                    // ピンまでの距離に変化があればtitleを更新する
                    pointAno.title = str
                    pointAno.subtitle = "サブタイトル(ピンをタップすると表示される)"
                }
            }

            //ロングタップを検出した位置にピンを立てる
            pointAno.coordinate=center
            mapView.addAnnotation(pointAno)
        }
    }

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

        let myPinIdentifier = "PinAnnotationIdentifier"

        // ピンを生成.
        let myPinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: myPinIdentifier)

        // アニメーションをつける.
        myPinView.animatesDrop = true

        // コールアウトを表示する.
        myPinView.canShowCallout = true

        // annotationを設定.
        myPinView.annotation = annotation

        return myPinView
    }

    //ViewController.swift:現在位置更新を受信する
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
        updateCurrentPos((locations.last?.coordinate)!)
        mapView.userTrackingMode = .follow
        let lonStr = (locations.last?.coordinate.longitude.description)!
        let latStr = (locations.last?.coordinate.latitude.description)!

        print("lonnow : " + lonStr)
        print("latnow : " + latStr)
    }

    //地図の初期化関数
    func initMap() {
        // 縮尺を設定
        var region:MKCoordinateRegion = mapView.region
        region.span.latitudeDelta = 0.02
        region.span.longitudeDelta = 0.02
        mapView.setRegion(region,animated:true)

        // 現在位置表示の有効化
        mapView.showsUserLocation = true
        // 現在位置設定(デバイスの動きとしてこの時の一回だけ中心位置が現在位置で更新される)
        mapView.userTrackingMode = .followWithHeading
    }

    //地図の中心位置の更新関数
    func updateCurrentPos(_ coordinate:CLLocationCoordinate2D) {
        var region:MKCoordinateRegion = mapView.region
        region.center = coordinate
        mapView.setRegion(region,animated:true)
    }

    //二点間距離の計算
    func calcDistance(_ a: CLLocationCoordinate2D, _ b: CLLocationCoordinate2D) -> CLLocationDistance {
        // CLLocationオブジェクトを生成
        let aLoc: CLLocation = CLLocation(latitude: a.latitude, longitude: a.longitude)
        let bLoc: CLLocation = CLLocation(latitude: b.latitude, longitude: b.longitude)
        // CLLocationオブジェクトのdistanceで2点間の距離(m)を算出
        let dist = bLoc.distance(from: aLoc)
        return dist
    }
}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2019/09/14 02:28

    高校生というのは、関係ないのでは?

    それと、コードを下さいなどの質問は当サイトでは推奨されていません。
    よって、コードの掲載は控えさせていただきます。

    試した事や、参考にしたサイトのリンクなどを貼ることにより、回答を得られるのではないでしょうか?

    キャンセル

回答 1

checkベストアンサー

0

調べていたら、同じようなことがQiitaで記事にされています。
https://qiita.com/koogawa/items/b5d610c23d92ca4fd84e

自分もコードを見て、気になったのですが、
下記がないからではないでしょうか?

mapView.delegate = self

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る