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

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

ただいまの
回答率

90.52%

  • Swift

    7233questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4093questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

openInMapsでマップを起動してルート検索後、元のアプリに戻ると"タッチしてナビに戻る"表示が出て、アプリの画面が下にズレる。

受付中

回答 0

投稿

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

t.harima

score 22

元アプリの"検索" ボタンを押して、openInMapsでマップアプリを起動してルート検索後、"出発"ボタンを押し、左上の元のアプリに戻るボタン"<"を押して元のアプリに戻ると、画面の上部に"タッチしてナビに戻る"という表示がされて画面が下にズレる。
元アプリの画面上部に表示される"タッチしてナビに戻る"という表示をしないようにしたいです。
長いソースで申し訳ありませんが、よろしくお願いいたします。

import UIKit
import MapKit
import CoreLocation


class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UIPickerViewDelegate, UIPickerViewDataSource {

    var myMapView : MKMapView!
    var myLocationManager : CLLocationManager!
    var userLocation : CLLocationCoordinate2D!
    var cmlkLocation : CLLocationCoordinate2D!

    var cmlkPickerView : UIPickerView!
    let pickerViewHeight : CGFloat = 160

    var pickerToolBar : UIToolbar!
    let toolBarHeight : CGFloat = 40.0

    var cmlkValues :  NSArray = ["下から選んでください。","県庁前 事業所","呉服町 事業所"]
    var cmlkRow : Int = 0
    var cmlkAddress : String = ""

    var cmlkPin : MKPointAnnotation!

    var selectButton : UIButton!
    var searchButton : UIButton!

    // 縮尺.
    var zoomInit : Bool = true
    let ZOOM_INIT_LAT : Double = 0.0177655284856755
    let ZOOM_INIT_LON : Double = 0.0160932555655791
    var myCoordingRegion : MKCoordinateRegion!
    var mySpan : MKCoordinateSpan!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let devMaxWidth  : CGFloat = self.view.bounds.width
        let devMaxHeight : CGFloat = self.view.bounds.height

        myMapView = MKMapView()
        myLocationManager = CLLocationManager()
        userLocation = CLLocationCoordinate2D()
        cmlkLocation = CLLocationCoordinate2D()
        selectButton = UIButton()
        searchButton = UIButton()

        // UIPickerViewを生成.
        cmlkPickerView = UIPickerView()
        pickerToolBar = UIToolbar()
        cmlkPin = MKPointAnnotation()

        selectButton.frame   = CGRect(x: 0.0, y: 20.0, width: devMaxWidth, height: 40.0)
        pickerToolBar.frame  = CGRect(x: 0.0, y: 60.0, width: devMaxWidth, height: toolBarHeight)
        cmlkPickerView.frame = CGRect(x: 0.0, y: 60.0 + toolBarHeight, width: devMaxWidth, height: pickerViewHeight)
        myMapView.frame      = CGRect(x: 0.0, y: 60.0, width: devMaxWidth, height: devMaxHeight - 60.0)
        searchButton.frame   = CGRect(x: devMaxWidth / 5.0 * 4.0, y: devMaxHeight - 40.0, width: devMaxWidth / 5.0, height: 40.0)


        myMapView.delegate = self
        myLocationManager.delegate = self
        // Delegateを設定する.
        cmlkPickerView.delegate = self
        // DataSourceを設定する.
        cmlkPickerView.dataSource = self
        // ToolBarを設定する.  2018.06.26.add
        pickerToolBar.backgroundColor = UIColor.cyan
        pickerToolBar.isHidden = true
        let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneBtn = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(self.onClickButton))
        pickerToolBar.items = [flexible,doneBtn]


        // 位置情報取得の許可状況を確認
        let status = CLLocationManager.authorizationStatus()

        if(status == CLAuthorizationStatus.notDetermined) {
            print("didChangeAuthorizationStatus:\(status)");
            self.myLocationManager.requestAlwaysAuthorization()
        }

        myLocationManager.desiredAccuracy = kCLLocationAccuracyBest
        myLocationManager.distanceFilter = 300
        myLocationManager.startUpdatingLocation()

        myMapView.setCenter(self.myMapView.userLocation.coordinate, animated: true)
        myMapView.userTrackingMode = MKUserTrackingMode.none
        myMapView.showsUserLocation = true

        selectButton.backgroundColor = UIColor.yellow
        selectButton.setTitle("事業所を選択", for: .normal)
        selectButton.setTitleColor(UIColor.black, for: .normal)
        selectButton.addTarget(self, action: #selector(self.onClickButton), for: .touchUpInside)

        searchButton.backgroundColor = UIColor.green
        searchButton.setTitle("検索", for: .normal)
        searchButton.setTitleColor(UIColor.black, for: .normal)
        searchButton.addTarget(self, action: #selector(self.onSearch), for: .touchUpInside)

        cmlkPickerView.backgroundColor = UIColor.cyan
        cmlkPickerView.layer.shadowOpacity = 0.5
        cmlkPickerView.isHidden = true

        // Viewに追加する.
        self.view.addSubview(myMapView)
        self.view.addSubview(selectButton)
        self.view.addSubview(pickerToolBar)
        self.view.addSubview(cmlkPickerView)
        self.view.addSubview(searchButton)

    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    // pickerに表示する行数を返すデータソースメソッド. (実装必須)
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return cmlkValues.count
    }

    // pickerに表示する値を返すデリゲートメソッド.
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return cmlkValues[row] as? String
    }

    // pickerが選択された際に呼ばれるデリゲートメソッド.
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        cmlkRow = row
        if cmlkRow == 0 {
            selectButton.setTitle("事業所を選択", for: .normal)
        } else if cmlkRow == 1 {
            cmlkAddress = "福岡市博多区千代4-1-33"
            cmlkLocation.latitude  =  33.602905
            cmlkLocation.longitude = 130.414481
            selectButton.setTitle("\(cmlkValues[cmlkRow])", for: .normal)
        } else if cmlkRow == 2 {
            cmlkAddress = "福岡市博多区上呉服町11-16"
            cmlkLocation.latitude  =  33.598882
            cmlkLocation.longitude = 130.410745
            selectButton.setTitle("\(cmlkValues[cmlkRow])", for: .normal)
        } else {
            cmlkAddress = ""
        }
    }

    @objc  func onClickButton() {
        if cmlkPickerView.isHidden == true {
            cmlkPickerView.isHidden = false
            pickerToolBar.isHidden  = false
            // セット済みのピンを削除
            self.myMapView.removeAnnotations(self.myMapView.annotations)
        } else {
            cmlkPickerView.isHidden = true
            pickerToolBar.isHidden  = true
            if cmlkRow != 0 {
                // セット済みのピンを削除
                self.myMapView.removeAnnotations(self.myMapView.annotations)

                pinStand()

            }
        }
    }

    @objc func onSearch(){
        // Pickerを隠す
        cmlkPickerView.isHidden = true
        pickerToolBar.isHidden = true
        // 選択されていない時は、終了する。
        if cmlkRow == 0 { return }

        pinStand()

        let myPlacemark = MKPlacemark(coordinate: (self.cmlkPin?.coordinate)!)
        let myMapItem = MKMapItem(placemark: myPlacemark)
        myMapItem.name = self.cmlkValues[self.cmlkRow] as? String
        let myLaunchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeTransit, MKLaunchOptionsMapTypeKey: MKMapType.standard.rawValue] as [String: Any]
        myMapItem.openInMaps(launchOptions: myLaunchOptions)
    }

    func pinStand(){
        //地図にピンを立てる。
        self.cmlkPin.title = self.cmlkValues[self.cmlkRow] as? String
        self.cmlkPin.subtitle = self.cmlkAddress
        self.cmlkPin.coordinate = CLLocationCoordinate2D(latitude: cmlkLocation.latitude, longitude: cmlkLocation.longitude)
        self.myMapView.addAnnotation(self.cmlkPin)
    }

    // 位置情報取得に成功したときに呼び出されるデリゲート.
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        userLocation = CLLocationCoordinate2DMake((manager.location?.coordinate.latitude)!, (manager.location?.coordinate.longitude)!)

        if zoomInit == true {
            myMapView.centerCoordinate = CLLocationCoordinate2DMake( userLocation.latitude, userLocation.longitude)

            var centerLocation = CLLocationCoordinate2D()
            centerLocation.latitude  = self.myMapView.region.center.latitude
            centerLocation.longitude = self.myMapView.region.center.longitude

            self.myCoordingRegion = self.myMapView.region
            self.myCoordingRegion.center = centerLocation

            mySpan = MKCoordinateSpan(latitudeDelta: ZOOM_INIT_LAT, longitudeDelta: ZOOM_INIT_LON)
            let myRegion : MKCoordinateRegion = MKCoordinateRegion(center: myMapView.centerCoordinate, span: mySpan)
            myMapView.region = myRegion

            myMapView.setRegion(myRegion, animated: true)
            zoomInit = false
        }
    }

    // 位置情報取得に失敗した時に呼び出されるデリゲート.
    func locationManager(_ manager: CLLocationManager,didFailWithError error: Error){
        print("locationManager error")
    }

    // Regionが変更された時に呼び出されるメソッド.
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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

  • Swift

    7233questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4093questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • トップ
  • Xcodeに関する質問
  • openInMapsでマップを起動してルート検索後、元のアプリに戻ると"タッチしてナビに戻る"表示が出て、アプリの画面が下にズレる。