gpt4 book ai didi

ios - Swift - NSArray 作为参数并在 TouchBegan 方法中调用 LocationManager 函数

转载 作者:行者123 更新时间:2023-11-30 14:17:52 26 4
gpt4 key购买 nike

我想要一种方法,可以找到按下屏幕时设备的位置到设备移动时的新位置之间的距离。如果在不同的位置再次按下屏幕,我希望该方法重新开始并找到设备从该位置移动的距离。由于iOS模拟器无法检测位置,所以我很难测试这个,但我的逻辑看起来准确吗?代码如下:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
var currentLocation = locations.first as! CLLocation
var currentAlt = currentLocation.altitude
var newLocation = locations.last as! CLLocation
var newAlt = newLocation.altitude
var lengthInMeters = newLocation.distanceFromLocation(currentLocation) as Double
var heightInMeters = abs(newAlt - currentAlt)
var hypotenuse = sqrt((lengthInMeters*lengthInMeters)+(heightInMeters+heightInMeters))
self.horizontalText.text = "Horizontal: " + "\(lengthInMeters)" + "m"
self.verticalText.text = "Vertical: " + "\(heightInMeters)" + "m"
self.totalText.text = "Total: " + "\(hypotenuse)" + "m"
}

}

我的主要问题是函数中的这个函数是否是 locationManager 的有效使用。我对 iOS/Swift 编程还比较陌生,但我仍然不完全确定每次触摸屏幕时 NSArray 的位置是否都会重新初始化。

最佳答案

没有;你的逻辑不准确。您的函数作用域是错误的,并且您对运行循环如何发生的理解是错误的。

Cocoa 框架中的第一个方法名称通常很好地描述了它们的功能,因此当触摸序列开始时会调用 touchesBegan ,而当位置更新发生时会调用 didUpdateLocations

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) 

CLLocationManager的委托(delegate)方法,因此假设此类被设置为位置管理器的委托(delegate),每次发生位置更新时都会调用它。

  1. 您所拥有的是在 touchesBegan 覆盖中声明的此方法,虽然它在语法上是合法的,但它永远不会被调用,除非您自己从函数内部调用它。
  2. 您对运行循环如何工作以及关闭时会发生什么的理解。在 touchesBegan
  3. 期间,您不会收到对 didUpdateLocations 的调用

您需要做的是将其放置在类的范围内,并将最新位置记录到类变量中,您可以在 touchesBegan 方法中引用该类变量。

class FooView:UIView,CLLocationManagerDelegate {

var firstLocation:CLLocation?
var currentLocation:CLLocation?
var locationManager = CLLocationManager()

func commonSetup() {
locationManager.delegate = self
locationManager.startUpdatingLocation()
}

override init(frame: CGRect) {
super.init(frame: frame)
commonSetup()
}

required init(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
commonSetup()
}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
if firstLocation == nil {
firstLocation = locations.first as? CLLocation
}
else {
currentLocation = locations.first as? CLLocation
}

}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

if let currentLocation = self.currentLocation,firstLocation = self.firstLocation {
var currentAlt = currentLocation.altitude
var firstAlt = firstLocation.altitude
var lengthInMeters = currentLocation.distanceFromLocation(firstLocation) as Double
var heightInMeters = abs(firstAlt - currentAlt)
var hypotenuse = sqrt((lengthInMeters*lengthInMeters)+(heightInMeters+heightInMeters))
self.horizontalText.text = "Horizontal: " + "\(lengthInMeters)" + "m"
self.verticalText.text = "Vertical: " + "\(heightInMeters)" + "m"
self.totalText.text = "Total: " + "\(hypotenuse)" + "m"
}


}


}

看起来您想要做的是显示“第一个”位置和触摸 View 时的位置之间的差异。

是的,您可以在模拟器中模拟静态和移动的位置。检查这些菜单。

在 Xcode 中

enter image description here

在模拟器中

enter image description here

关于ios - Swift - NSArray 作为参数并在 TouchBegan 方法中调用 LocationManager 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com