ビューがあり、このビューにUIPanGestureRecogniserを適用しました。
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAnim:)];
[sliderView addGestureRecognizer:panGesture];
[panGesture release];
ジェスチャーをうまく検出して処理できます。ただし、ジェスチャが終了したら、別の方法を開始したいと思います。
この種の検出を可能にする2つの方法があることを知っています。 touchesEnded
とtouchesCancelled
ただし、タッチがジェスチャになるとすぐにtouchesCancelled
が呼び出されることがわかりました。つまり、ジェスチャ呼び出しとtouchesEnded
は、まれにしか呼び出されません。
左/右にパンし、ジェスチャーの終了時に別の関数呼び出しを開始できるようにします。どうすればいいですか?
パンジェスチャ終了イベントは、UIGestureRecognizerStateEnded
で状態を確認することで検出できます。
以下のコードで確認してください。
-(void) panAnim:(UIPanGestureRecognizer*) gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
//All fingers are lifted.
}
}
From Apple documentation
パン操作は継続的です。許可される最小指数(minimumNumberOfTouches)がパンと見なされるのに十分に移動したときに開始します(UIGestureRecognizerStateBegan)。少なくとも最小数の指が押されている間に指が動くと、変化します(UIGestureRecognizerStateChanged)。すべての指を離すと終了します(UIGestureRecognizerStateEnded)。
パンジェスチャ終了イベントは、UIGestureRecognizerStateEnded
またはUIGestureRecognizerStateCancelled
またはUIGestureRecognizerStateFailed
で状態を確認することで検出できます。
以下のコードで確認してください。
-(void) panGesture:(UIPanGestureRecognizer*) gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateFailed || gestureRecognizer.state == UIGestureRecognizerStateCancelled)
{
//code what you want.
}
}
上記の答えはすべて正しいです。これはSwiftの更新されたものです。
スウィフト3:
func panGesture(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .ended {
// Do what you want
}
}
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をアニメーション化するためにView Controllerで必要なすべてのコードです。
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)
}
}
}
}
お役に立てれば。
これは、2本(またはそれ以上)の指パンでは機能しません。 numberOfMinimumTouches = 2
の場合、パンが開始され、スクロール/パンできますが、1本の指を持ち上げても、パンは継続します(2本の指の間ではなく1本の指の位置に移動します)。 State.ended
は、[〜#〜] all [〜#〜]指を離したときのみであるためです。 numberOfMinimumTouches
値に基づいて停止するには、別のアプローチを実装する必要があります。