【问题标题】:programmatically simulate a swipe gesture in Swift在 Swift 中以编程方式模拟滑动手势
【发布时间】:2016-12-21 13:35:14
【问题描述】:

我正在实现一个手势识别器,用于在 Swift 中滑动。我希望能够模拟卡片的投掷(以编程方式滑动视图)。

我以为会有一个内置功能,但我发现的只是一个用于点击手势而不是滑动手势的功能。

这就是我实现滑动手势的方式:

  let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
    cardView.addGestureRecognizer(gesture)
    cardView.userInteractionEnabled = true
}

func wasDragged (gesture: UIPanGestureRecognizer) {        
    let translation = gesture.translationInView(self.view)
    let cardView = gesture.view!

    // Move the object depending on the drag position
    cardView.center = CGPoint(x: self.view.bounds.width / 2 + translation.x,
                              y:  self.view.bounds.height / 2 + translation.y)

【问题讨论】:

  • 视图是否与您当前使用的代码一起移动?
  • 那么你想要以编程方式执行滑动手势的操作吗?为什么不在滑动和手动中调用相同的函数呢?当然,偏移量和位置也必须手动设置。
  • @NSGangster 是的,它可以很好地移动和滑动。
  • @Imbue 我不确定你手动调用它是什么意思?
  • 我的意思是。如果要“模拟”出牌,可以给实际出牌的函数传入一些随机值,进行模拟。然后就调用它。还是我误会了?

标签: ios swift uigesturerecognizer swipe-gesture


【解决方案1】:

对于 SWIFT 3.0

let swipeRightOrange:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(slideToRightWithGestureRecognizer))
swipeRightOrange.direction = .Right;

let swipeLeftOrange:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(slideToLeftWithGestureRecognizer))
swipeLeftOrange.direction = .Left;

@IBAction func slideToLeftWithGestureRecognizer(gestureRecognizer:UISwipeGestureRecognizer)
{
viewOrange.backgroundColor = UIColor.blue
}
@IBAction func slideToRightWithGestureRecognizer(gestureRecognizer:UISwipeGestureRecognizer)
{
viewOrange.backgroundColor = UIColor.lightGray
}

【讨论】:

    【解决方案2】:

    您无法模拟手势识别器的全部含义(我的意思是,您实际上无法让 iOS 认为这是一个真实的用户操作)。

    但是,您可以欺骗自己的代码,使其表现得像真正的滑动一样。为此,您需要先创建一个手势识别器:

    var gestureRecognizerSwipeRight = UISwipeGestureRecognizer(target: self, action: "activatedGestureRecognizer:")
    gestureRecognizerSwipeRight.direction = UISwipeGestureRecognizerDirection.Right
    yourView.addGestureRecognizer(gestureRecognizerSwipeRight)
    

    然后直接传递给你的action:

    // Some other place in your code
    self.activatedGestureRecognizer(gesture: gestureRecognizerSwipeRight)
    

    您的activatedGestureRecognizer(gesture:) 方法应该类似于:

    func activatedGestureRecognizer(gesture: UIGestureRecognizer) {
        if let gestureRecognizer = gesture as? UIGestureRecognizer {
    
            // Here you can compare using if gestureRecognizer == gestureRecognizerSwipeRight
            // ...or you could compare the direction of the gesture recognizer.
            // It all depends on your implementation really.
    
            if gestureRecognizer == gestureRecognizerSwipeRight {
                // Swipe right detected
            }
        }
    }
    

    公平地说,我认为这样做没有任何实际好处。简单地执行与滑动相关的操作而不是实际模拟手势识别器应该会好得多。

    例如,如果您需要在刷卡时为卡片设置动画,为什么不简单地禁用卡片视图上的用户交互并以编程方式对其进行动画处理?

    【讨论】:

      【解决方案3】:

      您可以自己创建UIPanGestureRecognizer 并将其传递给wasDragged 方法。不过,您应该检查翻译的不同值:

      let gesture = UIPanGestureRecognizer()
      gesture.setTranslation(CGPointMake(0, 100), inView: self.view)
      wasDragged(gesture)
      

      SWIFT 4.2

       let gesture = UIPanGestureRecognizer()
       gesture.setTranslation(CGPoint(x: 0, y: 100), in: self.view)
       wasDragged(gesture)
      

      虽然我认为你需要别的东西。为什么首先需要模拟这个手势?

      【讨论】:

      • 所以当他们按下按钮时,他们会扔掉甲板上的卡片。当您按下底部的喜欢或不喜欢按钮而不是滑动时,与 tinder 所做的相同。
      • 因此,您可以确切地知道您不想刷卡的程度。为什么不直接将其应用到卡片上,而不是创建模拟这种精确滑动级别的手势?
      • 我希望能够同时按下按钮或轻弹。但是对于按钮,轻弹的东西会遵循一条奇怪的曲线,不知道该怎么做,并认为可能有某种内置方法。
      【解决方案4】:

      以下代码可用于以编程方式滑动单元格。执行时,单元格将动画到滑动位置。

      @IBAction
      func swipeFirstCell() {
          if let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) {
              tableView.perform(Selector("_endSwipeToDeleteRowDidDelete:"), with: nil) // cancel any existing swipes
              tableView.perform(Selector("_swipeToDeleteCell:"), with: cell)
          }
      }
      

      请注意,您还需要为 canEditRowAtIndexPath 中的单元格返回 true。

      这可能会被 Apple 的私有 API 检测标记,但您至少可以将其用于开发,如果您真的需要,也许可以混淆字符串。

      【讨论】:

        【解决方案5】:

        你需要实现UISwipeGestureRecognizer

        override func viewDidLoad() {
        super.viewDidLoad()
        
        var swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
        swipeRight.direction = UISwipeGestureRecognizerDirection.Right
        self.view.addGestureRecognizer(swipeRight)
        
        var swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
        swipeDown.direction = UISwipeGestureRecognizerDirection.Down
        self.view.addGestureRecognizer(swipeDown)
        

        }

        func respondToSwipeGesture(gesture: UIGestureRecognizer) {
        
        if let swipeGesture = gesture as? UISwipeGestureRecognizer {
        
        
            switch swipeGesture.direction {
                case UISwipeGestureRecognizerDirection.Right:
                    print("Swiped right")
                case UISwipeGestureRecognizerDirection.Down:
                    print("Swiped down")
                case UISwipeGestureRecognizerDirection.Left:
                    print("Swiped left")
                case UISwipeGestureRecognizerDirection.Up:
                    print("Swiped up")
                default:
                    break
            }
         }
        }
        

        【讨论】:

        • 我已经可以刷卡了。我在您发布的任何地方都看不到它模拟用户滑动的地方?我错过了什么吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多