swift 拖动view, 自动停靠屏幕边缘

// 创建view 添加pan 手势 点手势
let drapBtn = UIView(frame:CGRect(x: 100, y: 100, width: 100, height: 100))
drapBtn.backgroundColor = UIColor.orange
self.view.addSubview(drapBtn)
drapBtn.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(dragMoving(pan:))))
drapBtn.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap(tap:))))
// pan手势事件
@objc func dragMoving(pan: UIPanGestureRecognizer){
let point = pan.translation(in: view)
if pan.state == .began {
pan.view?.alpha = 0.8
}
pan.view?.center = CGPoint(x: pan.view!.center.x + point.x, y: pan.view!.center.y + point.y)
pan.setTranslation(.zero, in: view)
if pan.state == .ended {
if let v = pan.view{
// 计算 当前view 距离屏幕上下左右的距离
let top = v.frame.minY ; let left = v.frame.minX ; v.alpha = 1
let bottom = view.frame.height - v.frame.maxY - 49
let right = KW-v.frame.maxX
// 计算出 view 距离屏幕边缘距离的最小值
let temp = [top,left,bottom,right].sorted().first
// 平移动画
UIView.animate(withDuration: 0.3, delay: 0.3, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
if temp == top{
v.transform = v.transform.translatedBy(x: 0, y: -top)
}else if temp == left{
v.transform = v.transform.translatedBy(x: -left, y: 0)
}else if temp == bottom{
v.transform = v.transform.translatedBy(x: 0, y: bottom)
}else{
v.transform = v.transform.translatedBy(x: right, y: 0)
}
}, completion: { (finish) in
})
}
}
}
// 点手势 事件处理
@objc func tap(tap: UITapGestureRecognizer){
print("tap")
}
浙公网安备 33010602011771号