拖动 UIButton 而不将其移动到中心 [Swift 3]
Drag UIButton without it shifting to center [Swift 3]
所以我发现了如何使用 UIPanGestureRecognizer 使按钮可拖动。但我知道如何做到这一点的唯一方法是通过中心存储和拖动按钮。这样做的问题是,如果您尝试从角落拖动按钮,按钮会立即从角落移动到中心。我正在寻找的是一种解决方案,它可以让我的手指在移动时保持在选定的位置上,而不会立即锁定到中心。
我目前使用的代码:
func buttonDrag(pan: UIPanGestureRecognizer) {
print("Being Dragged")
if pan.state == .began {
print("panIF")
buttonCenter = button.center // store old button center
}else {
print("panELSE")
let location = pan.location(in: view) // get pan location
button.center = location // set button to where finger is
}
}
提前致谢。
这至少可以通过两种不同的方式完成,一种使用 GestureRecognizer
你的问题方式 另一种方式是子类化 UIView
并实现touchesBegan
、touchesMoved
、touchesEnded
、touchesCancelled
通常适用于任何 UIView 子类,可以是 UIButton
或 UILabel
或 UIImageView
等等...
按照你的方式,使用 GestureRecognizer
我做了一些改变你仍然需要一个 var 来保持你的 UIButton
中触摸的原点 CGPoint
所以我们得到触摸位置相对于 UIButton,当继续拖动时,根据原点触摸位置和移动位置调整 UIButton 原点
方法 1 手势识别器
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
var buttonOrigin : CGPoint = CGPoint(x: 0, y: 0)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let gesture = UIPanGestureRecognizer(target: self, action: #selector(buttonDrag(pan:)))
self.button.addGestureRecognizer(gesture)
}
func buttonDrag(pan: UIPanGestureRecognizer) {
print("Being Dragged")
if pan.state == .began {
print("panIF")
buttonOrigin = pan.location(in: button)
}else {
print("panELSE")
let location = pan.location(in: view) // get pan location
button.frame.origin = CGPoint(x: location.x - buttonOrigin.x, y: location.y - buttonOrigin.y)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
方法2 UIView子类在本例中是UIButton子类
使用这个 UIButton
子类
import UIKit
class DraggableButton: UIButton {
var localTouchPosition : CGPoint?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
let touch = touches.first
self.localTouchPosition = touch?.preciseLocation(in: self)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
let touch = touches.first
guard let location = touch?.location(in: self.superview), let localTouchPosition = self.localTouchPosition else{
return
}
self.frame.origin = CGPoint(x: location.x - localTouchPosition.x, y: location.y - localTouchPosition.y)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
self.localTouchPosition = nil
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
self.localTouchPosition = nil
}
}
结果
希望对您有所帮助
所以我发现了如何使用 UIPanGestureRecognizer 使按钮可拖动。但我知道如何做到这一点的唯一方法是通过中心存储和拖动按钮。这样做的问题是,如果您尝试从角落拖动按钮,按钮会立即从角落移动到中心。我正在寻找的是一种解决方案,它可以让我的手指在移动时保持在选定的位置上,而不会立即锁定到中心。
我目前使用的代码:
func buttonDrag(pan: UIPanGestureRecognizer) {
print("Being Dragged")
if pan.state == .began {
print("panIF")
buttonCenter = button.center // store old button center
}else {
print("panELSE")
let location = pan.location(in: view) // get pan location
button.center = location // set button to where finger is
}
}
提前致谢。
这至少可以通过两种不同的方式完成,一种使用 GestureRecognizer
你的问题方式 另一种方式是子类化 UIView
并实现touchesBegan
、touchesMoved
、touchesEnded
、touchesCancelled
通常适用于任何 UIView 子类,可以是 UIButton
或 UILabel
或 UIImageView
等等...
按照你的方式,使用 GestureRecognizer
我做了一些改变你仍然需要一个 var 来保持你的 UIButton
中触摸的原点 CGPoint
所以我们得到触摸位置相对于 UIButton,当继续拖动时,根据原点触摸位置和移动位置调整 UIButton 原点
方法 1 手势识别器
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
var buttonOrigin : CGPoint = CGPoint(x: 0, y: 0)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let gesture = UIPanGestureRecognizer(target: self, action: #selector(buttonDrag(pan:)))
self.button.addGestureRecognizer(gesture)
}
func buttonDrag(pan: UIPanGestureRecognizer) {
print("Being Dragged")
if pan.state == .began {
print("panIF")
buttonOrigin = pan.location(in: button)
}else {
print("panELSE")
let location = pan.location(in: view) // get pan location
button.frame.origin = CGPoint(x: location.x - buttonOrigin.x, y: location.y - buttonOrigin.y)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
方法2 UIView子类在本例中是UIButton子类
使用这个 UIButton
子类
import UIKit
class DraggableButton: UIButton {
var localTouchPosition : CGPoint?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
let touch = touches.first
self.localTouchPosition = touch?.preciseLocation(in: self)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
let touch = touches.first
guard let location = touch?.location(in: self.superview), let localTouchPosition = self.localTouchPosition else{
return
}
self.frame.origin = CGPoint(x: location.x - localTouchPosition.x, y: location.y - localTouchPosition.y)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
self.localTouchPosition = nil
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
self.localTouchPosition = nil
}
}
结果
希望对您有所帮助