Обнаружение конца жесты панорамы
У меня есть представление, и я применил UIPanGestureRecogniser к этому представлению:
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAnim:)];
[sliderView addGestureRecognizer:panGesture];
[panGesture release];
Я могу точно определить и обработать жест. Тем не менее, я хочу инициировать другой метод после того, как жест закончился.
Я знаю, что есть два метода, позволяющих такое обнаружение. touchesEnded
и touchesCancelled
однако, я обнаружил, что touchesCancelled
вызывается, как только прикосновение становится жестом, т.е. я перемещаю свой палец достаточно, чтобы оправдать вызов жестов, и touchesEnded
редко, если вообще когда-либо, вызывается.
Я хочу иметь возможность панорамирования влево/вправо, а затем инициировать другой вызов функции при завершении жеста. Как это сделать?
Ответы
Ответ 1
Событие окончания жеста панорамирования может быть обнаружено путем проверки его состояния с помощью UIGestureRecognizerStateEnded
.
Проверьте с помощью приведенного ниже кода.
-(void) panAnim:(UIPanGestureRecognizer*) gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
//All fingers are lifted.
}
}
Из документации Apple
Жест панорамирования является непрерывным. Он начинается (UIGestureRecognizerStateBegan), когда минимально допустимое количество пальцев (минимальное количество пальцев) достаточно переместилось, чтобы считаться панорамированием. Он изменяется (UIGestureRecognizerStateChanged), когда палец двигается, когда нажата по крайней мере минимальное количество пальцев. Он заканчивается (UIGestureRecognizerStateEnded), когда все пальцы подняты.
Узнайте больше о UIPanGestureRecognizer
Ответ 2
Событие окончания жесткого жесткого диска можно обнаружить, проверив его состояние с помощью UIGestureRecognizerStateEnded
или UIGestureRecognizerStateCancelled
или UIGestureRecognizerStateFailed
Проверьте приведенный ниже код.
-(void) panGesture:(UIPanGestureRecognizer*) gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateFailed || gestureRecognizer.state == UIGestureRecognizerStateCancelled)
{
//code what you want.
}
}
Ответ 3
Все ответы правильные, это просто обновленный для Swift.
Swift 3:
func panGesture(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .ended {
// Do what you want
}
}
Ответ 4
В Swift 4 используйте UIGestureRecognizerState.ended.
например
if (gestureRecognizer.state == UIGestureRecognizerState.ended) {
//Move label back to original position (function invoked when gesture stops)
UIView.animate(withDuration: 0.4) {
self.swipeLabel.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2)
}
}
Ниже приведен весь код, который необходим в контроллере представления для анимации UILabel с помощью жеста, в том числе, когда жест заканчивается.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var swipeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//Create gesture
let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(moveLabelBasedOn(gestureRecognizer:)))
//Assign gesture to UILabel
swipeLabel.addGestureRecognizer(gestureRecognizer)
}
//Animate Label in Resopnse to Gesture
@objc func moveLabelBasedOn(gestureRecognizer: UIPanGestureRecognizer) {
let changeInPosition = gestureRecognizer.translation(in: view)
//Move label in response to gesture
swipeLabel.center = CGPoint(x: view.bounds.width / 2 + changeInPosition.x, y: view.bounds.height / 2 + changeInPosition.y)
//Check if gesture ended
if (gestureRecognizer.state == UIGestureRecognizerState.ended) {
//Move label back to original position (function invoked when gesture stops)
UIView.animate(withDuration: 0.4) {
self.swipeLabel.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2)
}
}
}
}
Надеюсь это поможет.
Ответ 5
Это не будет работать для двух (или более) панорамирования. В этом случае при numberOfMinimumTouches = 2
панорама запускается, и вы можете прокручивать/панорамировать, но если поднять один палец, панорамирование все равно продолжится (переместитесь туда, где находится один палец вместо двух пальцев), так как State.ended
- это только когда ВСЕ пальцы подняты. Чтобы остановиться на numberOfMinimumTouches
значения numberOfMinimumTouches
, необходимо реализовать другой подход.