У меня есть mapView, в котором я хочу включить или отключить постоянное отслеживание местоположения.Если он включен, я хочу, чтобы он временно приостанавливался, когда на карте было взаимодействие с пользователем, и возобновлялся после того, как взаимодействие с пользователем закончилось через короткий промежуток времени.Я пытаюсь сделать это в regionWillChange
и regionDidChange
, с проверками, чтобы увидеть, был ли регион изменен с помощью пользовательских манипуляций.Приостановка работает просто отлично, но когда приходит время возобновить, таймер, кажется, никогда не завершается.
func pauseTrack() {
locationManager.stopUpdatingLocation()
self.trackingMode = false
self.shouldTrack = true
}
@objc func resumeTrack() {
locationManager.startUpdatingLocation()
self.trackingMode = true
self.shouldTrack = false
}
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
let didMapTouchesBegin = mapTouchBegan()
if (didMapTouchesBegin == true && self.trackingMode == true) {
self.pauseTrack()
if (self.resumeTimer != nil) {
self.resumeTimer.invalidate()
}
self.countdownTime = 5.0
}
}
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
let didMapTouchesEnd = mapTouchEnded()
if (didMapTouchesEnd == true && self.shouldTrack == true) {
print("tracking will resume")
self.resumeTimer = Timer(timeInterval: self.countdownTime, target: self, selector: #selector(self.resumeTrack), userInfo: nil, repeats: false)
}
}
func mapTouchBegan() -> Bool {
let view = self.mapView.subviews[0]
if let gestureRecognizers = view.gestureRecognizers {
for recognizer in gestureRecognizers {
if (recognizer.state == UIGestureRecognizerState.began) {
print("user started touching screen")
return true
}
}
}
return false
}
func mapTouchEnded() -> Bool {
let view = self.mapView.subviews[0]
if let gestureRecognizers = view.gestureRecognizers {
for recognizer in gestureRecognizers {
if (recognizer.state == UIGestureRecognizerState.ended) {
print("user finished touching screen")
return true
}
}
}
return false
}
print("tracking will resume")
выводит на консоль, как и ожидалось, и другие записи в консоли имеютподтвердил, что отслеживание входов работает как задумано, но по какой-то причине таймер просто не работает.Я подтвердил, что это не ноль после его создания, и я также попытался создать его внутри Dispatch.main.async { }
, потому что я думал, что многопоточность может быть проблемой, но это тоже не сработало.