#63 懸浮按鈕拖移、自動吸附左右邊&UIPanGestureRecognizer

燮羽(will)
4 min readDec 21, 2021
思維導圖

最近很愛使用心智圖,因為滿多內容用文字說明,有點辛苦,實際使用之後發現圖像比較方便自己理解,所以將實現的想法直接用心智圖的方式表現。

主要功能:

1.按鈕拖移

2.按鈕自動吸附左右邊

拖移手勢,滿多文章有分享如何達成,單存讓按鈕可以有拖移效果,其實還滿簡單的。但開始動手做的時候發現最大困難點是:

點擊螢幕之後,按鈕會瞬移到點擊位置

  • 會發生按鈕瞬移的主要問題,是因為點擊位置跟按鈕中心位置不同,所以在點擊之後,按鈕中心就會被吸到點擊時的位置,所以將按鈕原點位置提供給按鈕就可以解決這問題~

主要code


func setPanButton() {

// 拖曳手勢
let pan = UIPanGestureRecognizer(
target:self,
action:#selector(ViewController.pan(recognizer:)))

// 最少可以用幾指拖曳
pan.minimumNumberOfTouches = 1

// 最多可以用幾指拖曳
pan.maximumNumberOfTouches = 1

// 為這個可移動的 Button 加上監聽手勢
gifButton.addGestureRecognizer(pan)
}

// 觸發拖曳手勢後 執行的動作
@objc func pan(recognizer:UIPanGestureRecognizer) {

// 拖移手勢的狀態
switch recognizer.state {

case .began:
//開始移動,加入按鈕中心位置
buttonPoint = gifButton.center
case .changed:
//拖移狀態在螢幕上的位置
let translation = recognizer.translation(in: view)
//設定要移動按鈕的位置 = 按鈕位置+目前在畫面上的位置
gifButton.center = CGPoint(x: buttonPoint.x + translation.x, y: buttonPoint.y + translation.y)

case .ended:
//畫面的寬度
guard let viewSize = self.view.superview?.bounds.size.width else {
print("auotPan Get viewSize Fail")
return
}

//如果按鈕結束位置 大於螢幕一半。 決定按鈕要吸附在左邊還是右邊
if gifButton.center.x >= viewSize / 2 {
gifButton.frame = CGRect(x: viewSize - gifButton.frame.width, y: gifButton.frame.origin.y, width: gifButton.frame.width, height: gifButton.frame.height)

} else {
gifButton.frame = CGRect(x: CGFloat(0.0), y: gifButton.frame.origin.y, width: gifButton.frame.width, height: gifButton.frame.height)
}
default:
break
}

}

完成GIF

參考文章

--

--