拖拽手勢提供的函式
| 函式 | 描述 |
|---|---|
| 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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/274758.html
標籤:其他
下一篇:SQLite命令基礎詳解
