Swift - 拖动回弹效果的实现(拖放后自动归位)
作者:hangge | 2017-02-13 08:10
下面通过一个 UIView 来演示如何实现拖动回弹的效果,为了让效果看的更加明显,这里将 UIView 的背景设置为橙色。
1,效果图
方块可以向上或者向下拖动,松开后会自动恢复到原先位置,同时具有动画效果。

2,实现步骤
(1)在StoryBoard 中添加一个 View,设置橙色背景,并添加好相关约束。

(2)拖动一个 UIPanGestureRecognizer 到这个 View 上。

(3)切换到双向视图,将这个 UIPanGestureRecognizer、橙色的 View、以及该 View 的 Top Layout Contraint 拖动到 ViewController 中绑定。
(4)下面是完整代码:
import UIKit
class ViewController: UIViewController {
//拖动的view
@IBOutlet weak var myView: UIView!
//拖动view的上约束
@IBOutlet weak var myViewTopLayoutConstraint: NSLayoutConstraint!
//拖动手势
@IBOutlet var panGesture: UIPanGestureRecognizer!
//保存初始时拖动view上约束的值
var myViewTopLayoutConstant: CGFloat!
//保存初始时拖动view的y坐标值
var myViewOriginY: CGFloat!
override func viewDidLoad() {
super.viewDidLoad()
//添加拖动手势响应
panGesture.addTarget(self, action: #selector(ViewController.pan))
//保存初始时拖动view上约束的值(用于后面还原)
myViewTopLayoutConstant = myViewTopLayoutConstraint.constant
}
//拖动手势
func pan() {
//拖动开始
if panGesture.state == .began {
myViewOriginY = myView.frame.origin.y
}
//拖动过程
else if panGesture.state == .changed {
let y = panGesture.translation(in: self.view).y
myViewTopLayoutConstraint.constant = myViewTopLayoutConstant + y
}
//拖动结束
else if panGesture.state == .ended {
//回弹
UIView.animate(withDuration: 0.4, delay: 0, options: .curveEaseInOut, animations: {
() -> Void in
self.myView.frame.origin.y = self.myViewOriginY
}, completion: { (success) -> Void in
if success {
//回弹动画结束后恢复默认约束值
self.myViewTopLayoutConstraint.constant = self.myViewTopLayoutConstant
}
})
return
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
全部评论(0)