平移手势后将视图返回到原始位置,快速

Posted

技术标签:

【中文标题】平移手势后将视图返回到原始位置,快速【英文标题】:Returning view to original position after pan gesture, swift 【发布时间】:2016-04-08 14:54:05 【问题描述】:

我有一个UIView(图像中的红色),我可以在 x 轴上平移。我可以将视图返回到原始位置,但我想返回到那个位置,就好像它被轻弹簧拉动一样,或者通过某种减速慢慢回到原始位置。

此刻它奇怪地跳回到那个位置。

这是我的相关代码,并附上一张图片以显示视图的最大位置。

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) 

        if recognizer.state == UIGestureRecognizerState.Ended 

            print(backgroundView.center.x) //120.0
            print(backgroundView.center.y) //64.0

            let xDivision = Double(backgroundView.center.x/120.0)
            print(xDivision)

            recognizer.view?.center = CGPointMake(120.0, 64.0)

            self.view.frame = CGRectMake(backgroundView.center.x, 0, self.view.frame.width , self.view.frame.height)

            UIView.animateWithDuration(xDivision, delay: 0.0, usingSpringWithDamping: 2.0, initialSpringVelocity: 2.0, options: UIViewAnimationOptions.CurveEaseIn, animations: 

                self.view.center.x = 120.0

                , completion:  (true) in

                    print("Animation Complete")
                    print(self.backgroundView.center.x)
            )



        

        let translation: CGPoint = recognizer.translationInView(self.view)
        //recognizer.view?.center = CGPointMake((recognizer.view?.center.x)!, (recognizer.view?.center.y)! + translation.y)
        recognizer.setTranslation(CGPointMake(0, 0), inView: self.view)


        var center: CGPoint = (recognizer.view?.center)!
        print(center.x)
        center.x += translation.x
        if center.x < 50.0 || center.x > 320.0 
            return
        
        recognizer.view?.center = center

    

关于我如何实现这一目标的任何想法。这个动画的一个很好的例子是这个应用程序 - http://rise.simplebots.co

谢谢。

【问题讨论】:

【参考方案1】:

如果您使用自动布局,更改框架或中心属性可能会导致问题。您是否考虑过仅更改约束的常数?喜欢:

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) 

    switch recognizer.state 
    case .Began:
        //do something

    case .Changed:
        let translation = recognizer.translationInView(self.view)
        self.leftContraint.constant = self.leftContraint.constant + translation.x
        recognizer.setTranslation(.zero, inView: self.view)

    case .Ended:
        UIView.animateWithDuration(1,
            delay: 0,
            options: .CurveEaseOut,
            animations: 
                self.leftContraint.constant = //your value
                self.view.layoutIfNeeded()
            ,
            completion: nil)

    default: ()
    

这帮助我解决了类似的问题。

【讨论】:

以上是关于平移手势后将视图返回到原始位置,快速的主要内容,如果未能解决你的问题,请参考以下文章

如果检测到超出范围,则禁用平移手势

无法在其父视图之外平移手势较小的 UIView

UIImageView 上的捏合、平移和双击手势

如何将平移手势从滚动视图转发到另一个滚动视图

将动态视图捕捉到屏幕顶部、底部或中间的统一行为

将平移手势识别器限制为特定圆圈