拖拽手势提供的函数
函数 | 描述 |
---|---|
open func translation(in view: UIView?) -> CGPoint | 获取到的是移动后手指在相对坐标系内移动的距离 |
open func setTranslation(_ translation: CGPoint, in view: UIView?) | 用于设置每次拖拽操作时视图的偏移量,状态切换至end时,要记得清零 |
open func velocity(in view: UIView?) -> CGPoint | 获得平移时的速度 |
解决思路
1.创建拖拽手势实例,并依附于视图
let v = UIView.init(frame: .init(x: 100, y: 300, width: 100, height: 100))
v.backgroundColor = .red
let p = UIPanGestureRecognizer.init(target: self, action: #selector(handlePan(pan:)))
v.addGestureRecognizer(p)
2.实现手势的回调方法
@objc func handlePan(pan: UIPanGestureRecognizer) {
if pan.state == .changed || pan.state == .ended {
let view = pan.view
var viewRect = view?.frame
let offset = pan.translation(in: view)
print(offset.x)
//例子中只演示仅竖直方向的手势处理,水平方向逻辑与之类似
viewRect = changeYWith(frame: viewRect!, offset: offset)
//更新视图的frame,已达到移动的视觉效果
view?.frame = viewRect!
//清零视图的偏移量记录
pan.setTranslation(.zero, in: view)
}
}
3.实现更新视图坐标的方法(水平移动只更新x轴坐标,竖直方向移动则只更新y轴坐标)
func changeYWith(frame: CGRect, offset: CGPoint) -> CGRect {
var rect = frame
var viewRect = rect.origin
viewRect.y = offset.y + viewRect.y
//移动至屏幕顶端,则不再继续向上
if viewRect.y <= 0 {
viewRect.y = 0
}
//移动至屏幕底部,则不再向下
if viewRect.y >= self.view.frame.maxY - rect.height {
viewRect.y = self.view.frame.maxY - rect.height
}
rect.origin = viewRect
return rect
}