VesselWheel

MapView 본문

Xcode Study

MapView

JasonYang 2023. 10. 18. 12:49

MapView 현재 위치 표시하기

//

//  ViewController.swift

//  lecture 09 MapView

//

//  Created by Jason Yang on 10/17/23.

//

 

import UIKit

import MapKit

 

class ViewController: UIViewController, CLLocationManagerDelegate {

   //                                    ㄴ 지도 보이기 delegate

    @IBOutlet var myMap: MKMapView!

    @IBOutlet var lbLocationInfo1: UILabel!

    @IBOutlet var lbLocationInfo2: UILabel!

 

    // let locationManager = CLLocationManager()  // 지도 보이기 변수

    let locationManager = CLLocationManager()

    // 앱 실행 시 지도 표시 코드

 

    

 

    override func viewDidLoad() {

        super.viewDidLoad()

        

        // Do any additional setup after loading the view.

        lbLocationInfo1.text = "" //위치 정보를 표시할 레이블에는 아직 특별히 표시할 필요 없어 공백으로 대기

        lbLocationInfo2.text = "" //위치 정보를 표시할 레이블에는 아직 특별히 표시할 필요 없어 공백으로 대기

        locationManager.delegate = self //locationManger의 위임자를 self로 설정

        locationManager.desiredAccuracy = kCLLocationAccuracyBest //지도 정확도 최고로 지정

        locationManager.requestWhenInUseAuthorization() //위치 데이터의 사용자 승인 요청

        locationManager.startUpdatingLocation() //위치 업데이트

        myMap.showsUserLocation = true //위치값을 표시하기 위한 true값 설정

 

    }

    

    func goLocation(latitudeValue: CLLocationDegrees, longitudeValue : CLLocationDegrees, delta span : Double) {

        let pLocation = CLLocationCoordinate2DMake(latitudeValue, longitudeValue)

        let spanValue = MKCoordinateSpan(latitudeDelta: span, longitudeDelta: span)

        // span 범위 값을 매개변수로 하여 MKCoordinateSpanMake 함수 호출, 리턴 값을 spanValue로 받는다. span : 기간

        let pRegion = MKCoordinateRegion(center: pLocation, span: spanValue) // pLocation and spanValue 값을 매개변수, MKCoordinateRegionMake 함수를 호출하여 리턴 값을 pRegion으로 받는다.

        myMap.setRegion(pRegion, animated: true) //pRegion 을 매개변수로 하여 myMap.setRegion 함수를 호출

    }

    //last location present

    func locationManager(_ manager : CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let pLocation = locations.last // 마지막 위치 값

        goLocation(latitudeValue: (pLocation?.coordinate.latitude)!, longitudeValue: (pLocation? .coordinate.longitude)!, delta: 0.01)

        //goLocation(latitudeValue: (pLocation?.coordinate.latitude)!, longitudeValue: (pLocation?.coordinate.longitude)!, delta: 0.01)

        // delta값은 지도의 크기 지정, 값이 작을 수록 확대되는 효과 0.01은 1의 값보다 지도를 100배로 확대해서 볼 수 있는 것.

        CLGeocoder().reverseGeocodeLocation(pLocation!, completionHandler: {

            (placemarks, error) -> Void in

            let pm = placemarks!.first

            let country = pm!.country

            var address:String = country!

            if pm!.locality != nil {

                address += " "

                address += pm!.locality!

            }

            if pm!.thoroughfare != nil {

                address += " "

                address += pm!.thoroughfare!

            }

            self.lbLocationInfo1.text = "current loaction"

            self.lbLocationInfo2.text = address

            //self class or structure의 자기자신을 가리킨다.

        })

        locationManager.stopUpdatingLocation()

    }

    

    @IBAction func segChangeLocation(_ sender: UISegmentedControl) {

 

        

    }

    

}