使用 Swift 获取用户面临的方向

Posted

技术标签:

【中文标题】使用 Swift 获取用户面临的方向【英文标题】:Getting the direction the user is facing using Swift 【发布时间】:2020-05-10 03:36:22 【问题描述】:

我试图以标签上显示的 N、S、E、W、NE、SE、SW、NW 的形式向用户指示他所面对的方向。每当用户改变他的物理方向时,标签就会更新为当前方向。

有什么建议吗?

【问题讨论】:

【参考方案1】:

Swift 5.2

您可以使用CoreLocation 框架来做到这一点。

    符合CLLocationManagerDelegate协议 实例化CLLocationManager 的实例并将委托设置为self 如果您只需要标题(而不是实际用户位置),则不需要用户权限 告诉CLLocationManager 开始更新标题 标题将报告回委托方法didUpdateHeading 使用 switch 语句根据输入的度数查找基本方向。 更新您的标签

import CoreLocation
import UIKit

class ViewController: UIViewController, CLLocationManagerDelegate 
    
    @IBOutlet var directionLabel: UILabel!

    var locationManager: CLLocationManager!
    
    override func viewDidLoad() 
        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.startUpdatingHeading()
    
    
    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) 
        directionLabel.text = cardinalValue(from: newHeading.trueHeading)
    
    
    func cardinalValue(from heading: CLLocationDirection) -> String 
        switch heading 
        case 0 ..< 22.5:
            return "N"
        case 22.5 ..< 67.5:
            return "NE"
        case 67.5 ..< 112.5:
            return "E"
        case 112.5 ..< 157.5:
            return "SE"
        case 157.5 ..< 202.5:
            return "S"
        case 202.5 ..< 247.5:
            return "SW"
        case 247.5 ..< 292.5:
            return "W"
        case 292.5 ..< 337.5:
            return "NW"
        case 337.5 ... 360.0:
            return "N"
        default:
            return ""
        
    


代理的标题可以通过.magneticHeading.trueHeading 访问

磁航向

此属性中的值表示相对于 与地理北极不同的磁北极 极。值 0 表示设备指向磁北, 90 表示指向东方,180 表示指向南方,以此类推。 此属性中的值应始终有效。

真航向

此属性中的值表示相对于 地理北极。值 0 表示设备指向 正北,90 表示正东,180 表示正东 正南,等等。负值表示标题 无法确定。

【讨论】:

如何处理 22.53 的标题? 谢谢你!这正是我所需要的。但是当我尝试在操场上运行此代码时,函数 locationManager 永远不会被调用,并且标签不会显示任何内容。我该如何解决这个问题? 并且您可以使用CLLocationManager.headingAvailable()检查您正在运行的任何设备上是否有可用的航向信息//返回布尔值 我在 iPad 上的 Playgrounds 上运行它,CLLocationManager.headingAvailable() 返回 true。 试试PlaygroundPage.current.needsIndefiniteExecution = true

以上是关于使用 Swift 获取用户面临的方向的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何显示用户的前进方向 Swift

如何在 Xcode swift 中更改图片方向

使用 mapKit 的地图显示相反的方向(iOS Swift)

将方向更改回纵向

检测屏幕方向变化(快速)

当设备方向更改 SWIFT 5 时重绘自定义 UIVIEW