Pour l'application que je suis en train de construire, j'utilise cette classe Et, comme je reconnais d'autres gestes tels que les tapotements, les balayages ou les appuis longs sans utiliser la reconnaissance gestuelle d'Apple (j'ai construit la mienne car celle d'Apple n'est pas assez précise), j'aimerais pouvoir désactiver la reconnaissance XMCircleGestureRecognizer et ne l'activer que lorsque j'en ai besoin.
Le problème est que lorsque je l'appelle après certaines conditions, même si je lève mon doigt de l'écran, et que je touche à nouveau l'écran, il est toujours dans le XMCircleGestureRecognizer, et ne le quitte jamais. Je dois tuer l'application et la redémarrer.
Je ne suis pas sûr qu'il soit nécessaire de fournir une partie de mon code mais si c'est le cas, dites-le moi (il fait 600 lignes donc il est assez difficile de ne récupérer que la partie dont vous avez besoin).
Avez-vous une idée de la façon dont je pourrais faire cela ? Parce que je suis complètement bloqué sur ce point.
Merci beaucoup pour votre aide !
EDITAR:
import UIKit
class ViewController: UIViewController {
var gesture: XMCircleGestureRecognizer?
override func viewDidLoad() {
super.viewDidLoad()
ascending = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
gesture?.isEnabled = false
super.touchesBegan(touches, with: event)
for touch in touches{
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if finger == nil {
fingers[index] = String(format: "%p", touch)
if (finger1.isEmpty){
finger1 = [point.x, point.y]
} else if (finger2.isEmpty){
finger2 = [point.x, point.y]
} else if (finger3.isEmpty){
finger3 = [point.x, point.y]
} else if (finger4.isEmpty){
finger4 = [point.x, point.y]
} else if (finger5.isEmpty){
finger5 = [point.x, point.y]
}
break
}
}
}
timer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(increaseValue), userInfo: nil, repeats: true)
if ascending {
ascending = false
}
else {
ascending = true
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
for touch in touches {
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == String(format: "%p", touch) {
switch (index){
case 0 :
finger1 += [point.x, point.y]
case 1 :
finger2 += [point.x, point.y]
case 2 :
finger3 += [point.x, point.y]
case 3 :
finger4 += [point.x, point.y]
case 4 :
finger5 += [point.x, point.y]
default :
break
}
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
endTime = getCurrentMillis()
gesture?.isEnabled = false
for touch in touches {
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == String(format: "%p", touch) {
fingers[index] = nil
break
}
}
}
direction[0] = ""
direction[1] = ""
direction[2] = ""
direction[3] = ""
direction[4] = ""
if finger1.count != 0 {
direction[0] = GestureRecognizer(coordinates: finger1, index: 0)
}
if finger2.count != 0 {
direction[1] = GestureRecognizer(coordinates: finger2, index: 1)
}
if finger3.count != 0 {
direction[2] = GestureRecognizer(coordinates: finger3, index: 2)
}
if finger4.count != 0 {
direction[3] = GestureRecognizer(coordinates: finger4, index: 3)
}
if finger5.count != 0 {
direction[4] = GestureRecognizer(coordinates: finger5, index: 4)
}
if Int64(endTime - startTime) < 400 {
// HERE I TEST MY GESTURES
}
}
func increaseValue() -> Int {
// HERE I TEST FOR LONG PRESS
else if !finger1.isEmpty && abs(finger1[finger1.count - 2] - finger1[0]) >= 40 && abs(finger1[1] - finger1[finger1.count - 1]) >= 40 {
gesture = XMCircleGestureRecognizer(midPoint: self.view.center, target: self, action: #selector(ViewController.rotateGesture(recognizer:)))
self.view.addGestureRecognizer(gesture!)
}
return value
}
func rotateGesture(recognizer:XMCircleGestureRecognizer)
{
StatusLabel.text = ""
if let rotation = recognizer.rotation {
currentValue += rotation.degrees / 360 * 100
StatusLabel.text = StatusLabel.text! + String(format:"Value: %.2f%%", currentValue)
}
if let angle = recognizer.angle {
StatusLabel.text = StatusLabel.text! + "\n" + String(format:"Angle: %.2f%", angle.degrees)
}
if let distance = recognizer.distance {
StatusLabel.text = StatusLabel.text! + "\n" + String(format:"Distance: %.0f%", distance)
}
}