滑动时获取移动平移差异使框架超出固定点,然后向右滑动以更新框架来改变方向

问题描述 投票:0回答:1

场景如下:用户点击并按住手指向左滑动UIView以显示下方的另一个视图。可见视图可向左滚动50个点然后停止。 View的框架转换为-50

在所有这段时间内,用户持续点击并最终向右改变方向并且可以滚动直到视图到达其帧转换为0的初始位置。

问题在于,当用户滚动超出框架停止的-50的固定点时,仍会记录平移,当用户将扫描方向改变到右侧时,视图会移动,我想消除差异。翻译中的这种差异似乎构成了视图的停止点,即用户改变了滑动方向。这是我的代码:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        drabbleLayer.isUserInteractionEnabled = true
        let recognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:)))
       drabbleLayer.addGestureRecognizer(recognizer)
    }

    @objc func handlePan(recognizer: UIPanGestureRecognizer) {
        if recognizer.state == .began {
            originalCenter = self.drabbleLayer!.center
        }

        var velocity = recognizer.velocity(in: drabbleLayer)

        if recognizer.state == .changed {

            let targetX: CGFloat = -50.0

            var tranlastion = recognizer.translation(in: self.drabbleLayer!)

            var newX: CGFloat {
                return originalCenter.x + tranlastion.x
            }

            if velocity.x < 0 {

                let log = tranlastion.x >= targetX
                let log2 = drabbleLayer.frame.origin.x >= targetX

                if  log && log2 {

                    dabbleLayer!.center.x = newX

                } else { drabbleLayer.center.x = -targetX * 2}

            } else {
                //this is where the Difference in Translation is noticeable if user swipes way beyond the stopping point to the left 
                if drabbleLayer.frame.origin.x <= 0 {
                    drabbleLayer!.center.x = newX

                } else {
                    //here view has to get to a full stop. Doesn't seem to work properly. 
                    drabbleLayer.frame.orgin.x = 0}
            }
        }
}

在我的完整代码中,我打印了翻译值,以便我可以看到它的变化。我正在检查速度方向的滑动方向。事情是在改变方向转换之后改变形式让我们说-74到200的值。在这种情况下,差异将是74(转换) - 50(这是我的代码中的停止点,targetX。此外,这种差异似乎如果用户从右向左滑动也会出现。

我可以捕捉到翻译的差异,并在改变方向之前立即以某种方式摆脱它吗?

swift translation swipe velocity uipangesturerecognizer
1个回答
0
投票

最后,我发现自己解决了这个问题。我仍然无法找到一个直接的解决方案,比如在改变方向之前保存最新的翻译值,这样我就可以计算出翻译的差异。

然而,在改变方向之前或之前,我确实将转换设置为targetX值,因此不再需要减去任何转换差异。这是我的新代码:

@objc func handlePan(recognizer: UIPanGestureRecognizer) {

    var tranlastion = recognizer.translation(in: self.incomeDrabbleLayer!)

    var newX: CGFloat {
        return originalCenter.x + tranlastion.x
    }

    let targetX: CGFloat = -50.0

    if recognizer.state == .began {
        originalCenter = self.incomeDrabbleLayer!.center
    }

    let velocity = recognizer.velocity(in: incomeDrabbleLayer)

    if recognizer.state == .changed {

        if velocity.x < 0 {
            if incomeDrabbleLayer.frame.origin.x > targetX {

                incomeDrabbleLayer.center.x = newX

            } else {

                incomeDrabbleLayer.frame.origin.x = targetX

                let targetTranslationPoint = CGPoint(x: targetX, y: 0)
                recognizer.setTranslation(targetTranslationPoint, in: incomeDrabbleLayer)
            }

        } else {

            if incomeDrabbleLayer.frame.origin.x < 0 {
                incomeDrabbleLayer.center.x = newX
            } else {
                incomeDrabbleLayer.frame.origin.x = 0
                recognizer.setTranslation(.zero, in: incomeDrabbleLayer)
            }

        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.