【问题标题】:Getting Translation of view with UIPanGestureRecognizer - swift - programmatically使用 UIPanGestureRecognizer 获取视图的翻译 - 快速 - 以编程方式
【发布时间】:2020-09-29 14:39:39
【问题描述】:

我正在使用 UIPanGestureRecognizer 方法翻译视图:

 @objc fileprivate func handlePan(_ gestureRecognizer : UIPanGestureRecognizer){
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
        makeDisappearButtons()
        deletebox.isHidden = false
        let translation = gestureRecognizer.translation(in: self.view)
        // note: 'view' is optional and need to be unwrapped
        gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
        gestureRecognizer.setTranslation(CGPoint.zero, in: self.view)
        if gestureRecognizer.view!.frame.intersects(deletebox.frame) {
            UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations: {
                gestureRecognizer.view!.transform = .init(scaleX: 0.6, y: 0.6)
                self.deletebox.transform = .init(scaleX: 1.2, y: 1.2)
            }, completion: nil)
        } else {
            gestureRecognizer.view!.setNeedsDisplay()
            gestureRecognizer.setTranslation(.zero, in: self.view)
            UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations: {
                self.deletebox.transform = .identity
                gestureRecognizer.view!.transform = .identity
            }, completion: nil)
        }
    }
    
    if gestureRecognizer.state == .ended {
        makeButtonsReAppear()
        if gestureRecognizer.view!.frame.intersects(deletebox.frame) {
            gestureRecognizer.view!.isHidden = true
            gestureRecognizer.view?.removeFromSuperview()
        } else {
            gestureRecognizer.view!.setNeedsDisplay()
            gestureRecognizer.setTranslation(.zero, in: self.view)
            gestureRecognizer.view!.transform = .identity
        }
        print(gestureRecognizer.translation(in: self.view))
        deletebox.isHidden = true
    }
}

我想知道 GestureRecognizer.state == .ended 中视图的翻译,但是当我尝试将其打印出来时,它是 x:0, y:0。

【问题讨论】:

    标签: swift uitextfield translation uipangesturerecognizer


    【解决方案1】:

    每次手势处理程序调用 changed 时,您都将翻译设置回 .zero

    gestureRecognizer.setTranslation(.zero, in: self.view)
    

    但是,当手指抬起时,状态变为ended,到那时翻译不再改变。 documentation 说:

    当用户的手指离开屏幕时,手势识别器进入 UIGestureRecognizer.State.ended 状态。

    所以在最后一次changed 调用ended 上的翻译是相同 - 因为你已经设置了gestureRecognizer.view 的框架在changed 内,你不需要在ended 内做任何事情。

    【讨论】:

      【解决方案2】:

      你从哪里调用了这个方法,可以放在viewDidAppear中试试。否则调用 setNeedsDisplay 和 LayoutIfNeeded 方法。

      【讨论】:

      • 此方法由手势识别器调用,而不是手动调用。我认为setNeedsDisplaylayoutIfNeeded 也不会产生任何影响。
      • 手势识别器调用该方法
      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 2015-06-21
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多