长按手势识别器产生重复位置 (SWIFT)

Posted

技术标签:

【中文标题】长按手势识别器产生重复位置 (SWIFT)【英文标题】:Longpress gestureRecognizer producing duplicate locations (SWIFT) 【发布时间】:2019-08-08 07:32:39 【问题描述】:

我正在制作一个应用程序,您可以在其中通过长按将图钉添加到地图位置。但是,长按似乎在复制这些位置。这是我的代码:

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

let userLocation = locations[0]

if activePlace == -1 

    latitude = userLocation.coordinate.latitude

    longitude = userLocation.coordinate.longitude

 else 

    latitude = Double(latitudePassed)!

    longitude = Double(longitudePassed)!





let latDelta : CLLocationDegrees = 0.05

let lonDelta : CLLocationDegrees = 0.05

let span = MKCoordinateSpan(latitudeDelta: latDelta, longitudeDelta: lonDelta)

let location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)

let region = MKCoordinateRegion(center: location, span: span)

map.setRegion(region, animated: true)

let uilpgr = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(gestureRecognizer:)) )

uilpgr.minimumPressDuration = 2

map.addGestureRecognizer(uilpgr)




@objc func longpress(gestureRecognizer: UIGestureRecognizer) 

let touchpoint = gestureRecognizer.location(in: self.map)

print(touchpoint)

let coordinate = map.convert(touchpoint, toCoordinateFrom: self.map)

let annotation = MKPointAnnotation()

annotation.coordinate = coordinate

annotation.title = "New Place"

let annotationLat = coordinate.latitude

let annotationLon = coordinate.longitude

places.append(["name": annotation.title!, "latitude": String(annotationLat), "longitude": String(annotationLon)])

map.addAnnotation(annotation)


如您所见,我在函数开始时打印接触点,并且多次打印相同的位置 - 有时两次,有时最多 12 次。我搜索了 *** 并找不到类似的问题...任何帮助将不胜感激。

【问题讨论】:

为什么每次在 didUpdateLocations 中更新位置时都添加 UILongPressGestureRecognizer ? 【参考方案1】:

Long-press gestures 是连续的。

尝试.began 状态,如下所示:

@objc func longpress(gestureRecognizer: UIGestureRecognizer) 

    if gestureRecognizer.state == .began 

        let touchpoint = gestureRecognizer.location(in: self.map)

        print(touchpoint)

        let coordinate = map.convert(touchpoint, toCoordinateFrom: self.map)

        let annotation = MKPointAnnotation()

        annotation.coordinate = coordinate

        annotation.title = "New Place"

        let annotationLat = coordinate.latitude

        let annotationLon = coordinate.longitude

        places.append(["name": annotation.title!, "latitude": String(annotationLat), "longitude": String(annotationLon)])

        map.addAnnotation(annotation)
    

还尝试只触发一次addGestureRecognizer,可能在您设置/启动mapviewDidLoad 中,所以这应该只是在viewDidLoad 中,并在您的map 初始化后触发:

let uilpgr = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(gestureRecognizer:)) )
uilpgr.minimumPressDuration = 2
map.addGestureRecognizer(uilpgr)

要了解更多关于 UIGestureRecognizer States 的信息,请关注 Apple 的文档:https://developer.apple.com/documentation/uikit/uigesturerecognizer/state

【讨论】:

谢谢@denis_lor。这在一次打印位置方面效果很好。但是,这确实意味着只有在用户停止长按后才会出现图钉......这并不理想,因为他们无法知道他们是否按下了足够长的时间...... 哦,我刚刚尝试使用 .began 状态,效果很好!我认为这会很好。非常感谢您的帮助。 我不知道你的意图 :) 让我更新我的答案! @DaveB1 完全正确!就可以了,我立即更新了我的答案我在评论中读到了你的意图:) 很高兴它有所帮助!

以上是关于长按手势识别器产生重复位置 (SWIFT)的主要内容,如果未能解决你的问题,请参考以下文章

确定长按手势识别器的位置

长按手势识别器触发两次[重复]

UIAlertView 警报在长按手势识别器中重复三次

UIAlertView 警报在长按手势识别器中重复三次

Swift:手势识别器无法识别的选择器发送到实例

ios手势识别之长按