info.plist を表示した状態で、右クリックし"Add row" を選択し、
Key: NSLocationWhenInUseUsageDescription Type: String Value: 現在地の情報を利用します。を追加します。 ここに追加した説明は、「許可を求める確認ダイアログ」や 「設定 -> プライバシー -> 位置情報サービスのアプリ設定」 で表示されます。
CompassBG.png | CompassFG.png |
これにより、ウィンドウ右下の Meida Library に追加した画像が表示されるようになります。
Main.storyboard上の画面に CompassBG.png, CompassFG.png の順でドラッグして重なるように配置します。 配置する位置は、後からウィンドウ右上の Size Inspector の View の X, Y で位置を調整できます。
class ViewController: UIViewController {の下の行まで持っていきます。
Main.storyboard上の部品を ViewController.swift にConnectします。
Viewのインスタンス | Connectionの種類 | 名前 |
Button(Start) | Action (TouchUpInside) | tapStart |
Button(Stop) | Action (TouchUpInside) | tapStop |
Label(緯度の右) | Outlet | latLabel |
Label(経度の右) | Outlet | lngLabel |
Label(標高の右) | Outlet | altLabel |
Label(偏角の右) | Outlet | argLabel |
Label(方位の右) | Outlet | dirLabel |
Segment Control | Outlet | northSwitch |
CompassFG.png | Outlet | compassFG |
ViewController.swiftに追加するコード(赤字部分) |
import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var latLabel: UILabel! @IBOutlet weak var lngLabel: UILabel! @IBOutlet weak var altLabel: UILabel! @IBOutlet weak var argLabel: UILabel! @IBOutlet weak var dirLabel: UILabel! @IBOutlet weak var northSwitch: UISegmentedControl! @IBOutlet weak var compassFG: UIImageView! let lm = CLLocationManager() @IBAction func tapStart(sender: AnyObject) { disabledLocationLabel() lm.requestWhenInUseAuthorization() lm.delegate = self startLocationService() startHeadingService() } @IBAction func tapStop(sender: AnyObject) { lm.stopUpdatingLocation() lm.stopUpdatingHeading() } func locationManager(manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) { let locationData = locations.last if let lng = locationData?.coordinate.longitude { lngLabel.text = String(format:"%.6f",lng) } if let lat = locationData?.coordinate.latitude { latLabel.text = String(format:"%.6f",lat) } if let alt = locationData?.altitude { altLabel.text = String(format:"%.6f",alt) } } func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { switch status { case .AuthorizedAlways, .AuthorizedWhenInUse : lm.startUpdatingLocation() case .NotDetermined: lm.stopUpdatingLocation() disabledLocationLabel() default: lm.stopUpdatingLocation() disabledLocationLabel() } } func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { var arg = newHeading.magneticHeading - newHeading.trueHeading if arg < 0 { arg += 360 } argLabel.text = String(format:"%.6f",arg) let northDir: CLLocationDirection = (northSwitch.selectedSegmentIndex == 0) ? newHeading.magneticHeading : newHeading.trueHeading compassFG.transform = CGAffineTransformMakeRotation(CGFloat(-northDir * M_PI/180)) dirLabel.text = String(format:"%.6f",northDir) } func startHeadingService() { northSwitch.selectedSegmentIndex = 0 lm.headingOrientation = .Portrait lm.headingFilter = 1 lm.startUpdatingHeading() } func startLocationService() { lm.desiredAccuracy = kCLLocationAccuracyBest lm.distanceFilter = 1 lm.startUpdatingLocation() } func disabledLocationLabel() { let msg = "位置情報の利用が未許可" lngLabel.text = msg latLabel.text = msg altLabel.text = msg } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } |