Signal-iOS/SignalMessaging/Views/ImageEditor/PermissiveGestureRecognizer.swift
2019-10-31 17:26:38 -03:00

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
}
}
}
}