スクリーンショット_2018-08-27_22

地図で3DTouchを利用してロケーションの取得

みなさん、ios開発楽しんでいますか?
いつも通り忘れっぽいので、実装方法などを備忘録がわりに書いていこうと思います!

今回は、タイトル通りですが、3DTouchと地図の合わせ技をやっていこうと思います!

まずは実装イメージから!

下にあるボタンやスライダーは気にしないでくださいね!まだ開発中ですので、実装がまだなもので、、、m(_ _)m


構成としては通常の状態で地図を強く押し込んでから別の地図を表示させるという感じです。
ですので、今回使用する地図は2つです。

手順1ストリーボードの準備

3DTouchで表示されるViewのことをpeekViewと言います。
このpeekViewで表示されるストリーボードを用意してあげてください。
今回はモーダルとして用意していますが、ナビゲーションの動作でも特に問題はないと思います^ ^

手順2コード実装

先ほど用意をしたストリーボードを実際に表示してみようと思います!

では、3DTouchを対象にするオブジェクトを登録していきます!

// 3DTouch
        self.registerForPreviewing(with: self , sourceView: self.myMapView)

「UIViewControllerPreviewingDelegate」をViewControllerに継承をしてあげます。
こんな感じですね!

extension ViewController: UIViewControllerPreviewingDelegate {
}

ではこの中にいつものようにデリゲートメソッドを用意していきます!

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

    // 3DTouchで表示されるデータがあるかどうかを問い合わせ、あればそのViewControllerを返す!
   // 3DTouchイベント発生直後に呼び出される
 }
    
 func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
    // 3DTouchで開いたViewをさらに強く押し込むことによって呼び出される
 }

では上記のデリゲートメソッドの中身を書いていこうと思います!

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        let controller = self.storyboard?.instantiateViewController(withIdentifier: "popView") as! PopViewController
        self.myCoordinate = self.myMapView.convert(location, toCoordinateFrom: self.myMapView)
        controller.coordinate = self.myCoordinate
        return controller
    }
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        let controller = self.storyboard?.instantiateViewController(withIdentifier: "popView") as! PopViewController
        controller.coordinate = self.myCoordinate
        self.present(controller, animated: true, completion: nil)
    }

上記のコードで一番重要なポイントは強く押し込んだ情報を元にロケーション情報を取得することです!!

それがこのコードです!

self.myMapView.convert(location, toCoordinateFrom: self.myMapView)

こうすることでlat,lngなどの情報を取得することができます!

これを後はPopViewControllerに渡してあげれば、地図上にピンを立てることができます!



この記事が気に入ったらサポートをしてみませんか?