86 lines
2.2 KiB
Swift
86 lines
2.2 KiB
Swift
//
|
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
// The most permissive GR possible.
|
|
//
|
|
// * Accepts any number of touches in any locations.
|
|
// * Isn't blocked by any other GR.
|
|
// * Blocks all other GRs.
|
|
public class PermissiveGestureRecognizer: UIGestureRecognizer {
|
|
|
|
@objc
|
|
public override func canPrevent(_ preventedGestureRecognizer: UIGestureRecognizer) -> Bool {
|
|
return true
|
|
}
|
|
|
|
@objc
|
|
public override func canBePrevented(by preventingGestureRecognizer: UIGestureRecognizer) -> Bool {
|
|
return false
|
|
}
|
|
|
|
@objc
|
|
public override func shouldRequireFailure(of otherGestureRecognizer: UIGestureRecognizer) -> Bool {
|
|
return false
|
|
}
|
|
|
|
@objc
|
|
public override func shouldBeRequiredToFail(by otherGestureRecognizer: UIGestureRecognizer) -> Bool {
|
|
return true
|
|
}
|
|
|
|
@objc
|
|
public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
|
|
handle(event: event)
|
|
}
|
|
|
|
@objc
|
|
public override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
|
|
handle(event: event)
|
|
}
|
|
|
|
@objc
|
|
public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
|
|
handle(event: event)
|
|
}
|
|
|
|
@objc
|
|
public override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
|
|
handle(event: event)
|
|
}
|
|
|
|
private func handle(event: UIEvent) {
|
|
var hasValidTouch = false
|
|
if let allTouches = event.allTouches {
|
|
for touch in allTouches {
|
|
switch touch.phase {
|
|
case .began, .moved, .stationary:
|
|
hasValidTouch = true
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if hasValidTouch {
|
|
switch self.state {
|
|
case .possible:
|
|
self.state = .began
|
|
case .began, .changed:
|
|
self.state = .changed
|
|
default:
|
|
self.state = .failed
|
|
}
|
|
} else {
|
|
switch self.state {
|
|
case .began, .changed:
|
|
self.state = .ended
|
|
default:
|
|
self.state = .failed
|
|
}
|
|
}
|
|
}
|
|
}
|