Avez-vous une idée s’il existe un moyen d’obtenir la longueur d’un geste de balayage ou le toucher afin que je puisse calculer la distance?
Il est impossible d'éloigner un geste d'un geste, car SwipeGesture déclenche la méthode permettant d'accéder à l'emplacement exactement une fois, à la fin du geste.
Peut-être souhaitez-vous utiliser un UIPanGestureRecognizer.
Si vous pouvez utiliser le geste panoramique, vous sauvegarderez le point de départ du panoramique et, si celui-ci est terminé, calculez la distance.
- (void)panGesture:(UIPanGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
startLocation = [sender locationInView:self.view];
}
else if (sender.state == UIGestureRecognizerStateEnded) {
CGPoint stopLocation = [sender locationInView:self.view];
CGFloat dx = stopLocation.x - startLocation.x;
CGFloat dy = stopLocation.y - startLocation.y;
CGFloat distance = sqrt(dx*dx + dy*dy );
NSLog(@"Distance: %f", distance);
}
}
En rapide
override func viewDidLoad() {
super.viewDidLoad()
// add your pan recognizer to your desired view
let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panedView))
self.view.addGestureRecognizer(panRecognizer)
}
@objc func panedView(sender:UIPanGestureRecognizer){
var startLocation = CGPoint()
if (sender.state == UIGestureRecognizerState.began) {
startLocation = sender.location(in: self.view)
}
else if (sender.state == UIGestureRecognizerState.ended) {
let stopLocation = sender.location(in: self.view)
let dx = stopLocation.x - startLocation.x;
let dy = stopLocation.y - startLocation.y;
let distance = sqrt(dx*dx + dy*dy );
NSLog("Distance: %f", distance);
if distance > 400 {
//do what you want to do
}
}
}
Espérons que cela aide tous les pionniers rapides
Pour ceux qui utilisent Xamarin:
void panGesture(UIPanGestureRecognizer gestureRecognizer) {
if (gestureRecognizer.State == UIGestureRecognizerState.Began) {
startLocation = gestureRecognizer.TranslationInView (view)
} else if (gestureRecognizer.State == UIGestureRecognizerState.Ended) {
PointF stopLocation = gestureRecognizer.TranslationInView (view);
float dX = stopLocation.X - startLocation.X;
float dY = stopLocation.Y - startLocation.Y;
float distance = Math.Sqrt(dX * dX + dY * dY);
System.Console.WriteLine("Distance: {0}", distance);
}
}
Vous ne pouvez le faire que de manière standard: rappelez-vous le point de contact de touchBegin et comparez le point de touchEnd.
func swipeAction(gesture: UIPanGestureRecognizer) {
let transition = sqrt(pow(gesture.translation(in: view).x, 2)
+ pow(gesture.translation(in: view).y, 2))
}
J'ai une implémentation similaire à la réponse dans Swift qui fait la distinction entre un glissement et un glissement en calculant la distance par rapport au conteneur et la vitesse du glissement.
@objc private func handleSwipe(sender: UIPanGestureRecognizer) {
if (sender.state == .began) {
self.swipeStart.location = sender.location(in: self)
self.swipeStart.time = Date()
}
else if (sender.state == .ended) {
let swipeStopLocation : CGPoint = sender.location(in: self)
let dx : CGFloat = swipeStopLocation.x - swipeStart.location.x
let dy : CGFloat = swipeStopLocation.y - swipeStart.location.y
let distance : CGFloat = sqrt(dx*dx + dy*dy );
let speed : CGFloat = distance / CGFloat(Date().timeIntervalSince(self.swipeStart.time))
let portraitWidth = min(self.frame.size.width, self.frame.size.height)
print("Distance: \(distance), speed: \(speed), dy: \(dy), dx: \(dx), portraitWidth: \(portraitWidth), c1: \(distance > portraitWidth * 0.4), c2: \(abs(dy) < abs(dx) * 0.25), c3: \(speed > portraitWidth * 3.0) ")
if distance > portraitWidth * 0.4 && abs(dy) < abs(dx) * 0.25 && speed > portraitWidth * 3.0 {
if dx > 0 {
delegate?.previousAssetPressed(self)
}else{
delegate?.nextAssetPressed(self)
}
}
}
}