Как предотвратить, чтобы случайное прикосновение вызывало прикосновения, начатое в swift 4.2? - PullRequest
0 голосов
/ 21 января 2019

У меня есть приложение, которое использует touchesBegan для выполнения действий для пользователя.Однако иногда прикосновение к экрану приводит только к тому, чтобы оставить текстовое поле.

Есть ли способ настроить запуск touchsBeagan на запуск только через 2 или 3 секунды при сохранении касания и, если касание меньше этого, вместозапускает действие, запускается resignFirstResponder?

Чтобы помочь в понимании, вот мои методы прикосновений:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    Feedback.share.hapticFeedback()
    startPoint = nil
    guard let touch = touches.first else {return}
    startPoint = touch.location(in: imageView)

    //Initialize whatever you need to begin showing selected rectangle below.
    rectShapeLayer.path = nil
    imageView.layer.addSublayer(rectShapeLayer)
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else {return}
    let currentPoint: CGPoint
    if let predicted = event?.predictedTouches(for: touch), let lastPoint = predicted.last {
        currentPoint = lastPoint.location(in: imageView)
    } else {
        currentPoint = touch.location(in: imageView)
    }
    let frame = rect(from: startPoint, to: currentPoint)

    //Show bounding box
    rectShapeLayer.path = UIBezierPath(rect: frame).cgPath
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else {return}
    let currentPoint = touch.location(in: imageView)
    let frame = rect(from: startPoint, to: currentPoint)

    //Remove bounding box but take snapshot of selected `CGRect` by frame
    rectShapeLayer.removeFromSuperlayer()
    let memeImage = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    save(imageView: imageView, image: memeImage)

}

1 Ответ

0 голосов
/ 26 января 2019

Я нашел способ гарантировать, что прикосновением к экрану он просто выполняет resignFirstResponder вместо другой функции.

Я только изменил метод touchesEnded (_ :), добавив «if frame.size».ширина <1 ". </p>

Это хорошо сработало для меня.

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else {return}
    let currentPoint = touch.location(in: ivPhoto)
    let frame = rect(from: startPoint, to: currentPoint)

    rectShapeLayer.removeFromSuperlayer()

    if frame.size.width < 1 {
        tfTop.resignFirstResponder()
        tfBottom.resignFirstResponder()
    } else {

        let memeImage = ivPhoto.snapshot(rect: frame, afterScreenUpdates: true)

        saveCrop(cropImage: memeImage)
    }
}
...