【问题标题】:How do I enable a single touch to handle both UILongPressGestureRecognizer and UIPanGestureRecognizer?如何启用单点触控来处理 UILongPressGestureRecognizer 和 UIPanGestureRecognizer?
【发布时间】:2015-12-03 12:43:17
【问题描述】:

我只想在检测到长按后执行平移手势。我正在监视“UIGestureRecognizerState.Changed”的长按手势,并调用我的选择器来处理那里的平移。选择器触发(我的“print()”检查显示在控制台中),但我必须在 uiview (blueRec) 实际移动/翻译之前抬起手指。

我知道长按和平移手势本质上是连续的,但是我如何使用触发长按的初始按下来平移触摸的 uiview (blueRec)?我不相信这根本不是一个案例 - requireGestureRecognizerToFail:

我已经精简了下面的代码,只包含基本的行。

@IBOutlet weak var graySuper: UIView!
@IBOutlet weak var blueRec: UIView!

@IBOutlet weak var blueLeading: NSLayoutConstraint!
@IBOutlet weak var blueTop: NSLayoutConstraint!

var longPressGesture:UILongPressGestureRecognizer!


override func viewDidLoad() {

    super.viewDidLoad()

    self.longPressGesture = UILongPressGestureRecognizer(target:self, action:"handleLongpress:")
    self.longPressGesture.minimumPressDuration = 2
    self.blueRec.addGestureRecognizer(self.longPressGesture)


}


func handleLongpress(sender:UILongPressGestureRecognizer) {

    print("LPress")

   switch (sender.state) {
    case UIGestureRecognizerState.Began:

        self.blueRec.center = sender.locationInView(self.graySuper)


        break;
    case UIGestureRecognizerState.Changed:

        self.blueRec.center = sender.locationInView(self.graySuper)



        break;
    case UIGestureRecognizerState.Ended:

        print("Press Ended ")

        break;
    default:
        break;
    } 

}

【问题讨论】:

标签: ios swift uigesturerecognizer uipangesturerecognizer uilongpressgesturerecogni


【解决方案1】:

我正在回答我自己的问题,因为这是一个非常基本的解决方案,目前我还没有遇到。希望这至少可以帮助某人。

长按手势足以跟踪可拖动对象的移动,不需要单独的平移手势,因为它出现在我的原始代码中。

    @IBOutlet weak var graySuper: UIView!
@IBOutlet weak var blueRec: UIView!

@IBOutlet weak var blueLeading: NSLayoutConstraint!
@IBOutlet weak var blueTop: NSLayoutConstraint!

var longPressGesture:UILongPressGestureRecognizer!


override func viewDidLoad() {

    super.viewDidLoad()

    self.longPressGesture = UILongPressGestureRecognizer(target:self, action:"handleLongpress:")
    self.longPressGesture.minimumPressDuration = 2
    self.blueRec.addGestureRecognizer(self.longPressGesture)


}


func handleLongpress(sender:UILongPressGestureRecognizer) {

    print("LPress")

   switch (sender.state) {
    case UIGestureRecognizerState.Began:

        self.blueRec.center = sender.locationInView(self.graySuper)


        break;
    case UIGestureRecognizerState.Changed:

        self.blueRec.center = sender.locationInView(self.graySuper)



        break;
    case UIGestureRecognizerState.Ended:

        print("Press Ended ")

        break;
    default:
        break;
    } 

【讨论】:

  • 我还没有弄清楚的是,将拖动的对象保持在其父视图的边界内所涉及的计算。使用平移手势,使用 translationInView 很有用,但使用长按手势,您可以使用 locationInView。我还没有弄清楚使用 locationInView 拖动到其父视图的限制。
  • 这行得通,但某些用途(包括我的)确实需要一个实际的 UIPanGestureRecognizer 才能使该类提供的内容受益,即。速度支持。如果有人对此有任何想法,这是我的用例:stackoverflow.com/questions/68663562/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多