Swift 中的可拖动 UIButton/元素?

Posted

技术标签:

【中文标题】Swift 中的可拖动 UIButton/元素?【英文标题】:Draggable UIButton/Elements in Swift? 【发布时间】:2016-03-14 22:28:38 【问题描述】:

这是我的第一个问题!我只是想知道,在 Swift(特别是 Swift 2,尽管这可能不言而喻!)中,您如何创建一个用户可以拖动的按钮。例如,如果它是一个 UIButton,用户可以点击并按住它,当他们移动手指时,UIButton 会随之移动,当他们松开它时,它会保持在用户离开它的位置。可能会有一个捕捉系统,但目前这并不重要。

我搜索了 *** 并发现了一些非常有趣的东西,但都是针对 Objective-C 的,虽然 Swift 在某些方面非常相似,但我丝毫不知道如何在 Swift 中实现它.

对于我正在从事的项目,我们将不胜感激!

非常感谢!

【问题讨论】:

你在使用自动布局吗?如果是这样,请发布您的限制条件。 【参考方案1】:

您可以在您的UIButton 上实现UIPanGestureRecognizer

无论您在何处创建按钮(viewDidLoad,如果使用网点):

let pan = UIPanGestureRecognizer(target: self, action: "panButton:")
button.addGestureRecognizer(pan)

这将创建一个新的平移手势识别器并将其添加到按钮。现在,您将要实现 pan 的动作。首先,您需要存储按钮的中心,以便在完成平移时能够将其重置。将此添加为视图控制器属性:

var buttonCenter = CGPointZero

然后你实现平移动作。请注意,您可以使用手势识别器状态来确定平移的开始和结束时间:

func panButton(pan: UIPanGestureRecognizer) 

    if pan.state == .Began 
        buttonCenter = button.center // store old button center
     else if pan.state == .Ended || pan.state == .Failed || pan.state == .Cancelled 
        button.center = buttonCenter // restore button center
     else 
        let location = pan.locationInView(view) // get pan location
        button.center = location // set button to where finger is
    


【讨论】:

【参考方案2】:

已接受答案的 Swift 4 和 5 版本:

var buttonCenter: CGPoint = .zero

viewDidLoad() 
    super.viewDidLoad()

    let pan = UIPanGestureRecognizer(target: self, action: #selector(YourViewController.panButton(pan:)))
    button.addGestureRecognizer(pan)


@objc func panButton(pan: UIPanGestureRecognizer) 
    if pan.state == .began 
        buttonCenter = button.center // store old button center
     else if pan.state == .ended || pan.state == .failed || pan.state == .cancelled 
        button.center = buttonCenter // restore button center
     else 
        let location = pan.location(in: view) // get pan location
        button.center = location // set button to where finger is
    

【讨论】:

【参考方案3】:

基本上,您希望实现一个触摸手势识别器,并在您点击/移动所述按钮时将按钮的中心设置为您按下的中心。

您可以这样做:https://***.com/a/31487087/5700898

还有,非常酷的想法!

【讨论】:

以上是关于Swift 中的可拖动 UIButton/元素?的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 框架不会随着使用 Swift 5 的可访问性大字体而增加

Swift 中的可选闭包属性

带有 Swift 的 TTTAttributedLabel 中的可点击链接

在“停止”事件期间如何定位克隆的可拖动元素?

当div可滚动时,div中的可拖动元素显示在放置区域的后面,需要它们显示在前面

如何在手指从1按钮拖动到下一个按钮时触发UIButton事件