首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可拖拽的UIView Swift 3

可拖拽的UIView Swift 3
EN

Stack Overflow用户
提问于 2017-05-01 14:00:03
回答 3查看 27.4K关注 0票数 26

我希望能够拖动屏幕上的对象,但它们不能。我什么都试过了,但还是不行。

以下是代码。

代码语言:javascript
复制
func panGesture(gesture: UIPanGestureRecognizer) {
    switch gesture.state {
    case .began:
        print("Began.")
        for i in 0..<forms.count {
            if forms[i].frame.contains(gesture.location(in: view)) {
                gravity.removeItem(forms[i])
            }
        }
    case .changed:
        let translation = gesture.translation(in: forms[1])

        gesture.view!.center = CGPoint(x: gesture.view!.center.x + translation.x, y: gesture.view!.center.y + translation.y)

        gesture.setTranslation(CGPoint.zero, in: self.view)

        print("\(gesture.view!.center.x)=\(gesture.view!.center.y)")
        print("t;: \(translation)")
    case .ended:
        for i in 0..<forms.count {
            if forms[i].frame.contains(gesture.location(in: view)) {
                gravity.addItem(forms[i])
            }
        }
        print("Ended.")
    case .cancelled:
        print("Cancelled")
    default:
        print("Default")
    }
}

它们也有重力。形状是正方形和圆形。

说明:在.began -I中,禁用所选表单的重力。在.changed中-我尝试更改坐标。在.end -I中再次启用重力。

ScreenShot。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-01 14:04:33

第1步:获取要在storyBoard中拖动的一个视图。

代码语言:javascript
复制
@IBOutlet weak var viewDrag: UIView!

第2步:添加PanGesture。

代码语言:javascript
复制
var panGesture       = UIPanGestureRecognizer()

第3步:在ViewDidLoad中使用添加以下代码。

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()

    panGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:)))
    viewDrag.isUserInteractionEnabled = true
    viewDrag.addGestureRecognizer(panGesture)

}

第4步: draggedView的代码。

代码语言:javascript
复制
func draggedView(_ sender:UIPanGestureRecognizer){
    self.view.bringSubview(toFront: viewDrag)
    let translation = sender.translation(in: self.view)
    viewDrag.center = CGPoint(x: viewDrag.center.x + translation.x, y: viewDrag.center.y + translation.y)
    sender.setTranslation(CGPoint.zero, in: self.view)
}

步骤5 :输出。

票数 101
EN

Stack Overflow用户

发布于 2020-05-21 22:21:47

如果你子类化一个视图,这是非常简单的:

DraggableView...

代码语言:javascript
复制
class DraggableView: UIIView {
    
    var fromleft: NSLayoutConstraint!
    var fromtop: NSLayoutConstraint!
    
    override func didMoveToWindow() {
        super.didMoveToWindow()
        if window != nil {
            fromleft = constraint(id: "fromleft")!
            fromtop = constraint(id: "fromtop")!
        }
    }
    
    override func common() {
        super.common()
        let p = UIPanGestureRecognizer(
           target: self, action: #selector(drag))
        addGestureRecognizer(p)
    }
    
    @objc func drag(_ s:UIPanGestureRecognizer) {
        let t = s.translation(in: self.superview)
        fromleft.constant = fromleft.constant + t.x
        fromtop.constant = fromtop.constant + t.y
        s.setTranslation(CGPoint.zero, in: self.superview)
    }
}

  1. 在场景中放置一个UIView。

  1. 如往常一样,从左侧(即x位置)添加约束,并从顶部(即y位置)添加约束。

故事板中的

  1. 只是简单地命名和约束"fromleft“ "fromtop"

你的任务完成了。

它现在可以完美地工作了--就是这样。

那个方便的constraint(调用是什么?

请注意,视图中的只是通过名称找到自己的约束。

在Xcode中,仍然没有办法使用像IBOutlets这样的约束。幸运的是,通过“标识符”可以很容易地找到它们。(实际上,这正是约束上的.identifier特性的目的。)

代码语言:javascript
复制
extension UIView {
    
    func constraint(id: String) -> NSLayoutConstraint? {
        let cc = self.allConstraints()
        for c in cc { if c.identifier == id { return c } }
        //print("someone forgot to label constraint \(id)") //heh!
        return nil
    }
    
    func allConstraints() -> [NSLayoutConstraint] {
        var views = [self]
        var view = self
        while let superview = view.superview {
            views.append(superview)
            view = superview
        }
        return views.flatMap({ $0.constraints }).filter { c in
            return c.firstItem as? UIView == self ||
                c.secondItem as? UIView == self
        }
    }

Tip...edge对阵中锋!

不要忘记在视图上设置约束时(如上图所示):

您可以将左边的设置为:

白盒左边缘的

  • ,或白盒中心的

根据您的情况选择正确的解决方案。它将使计算、设置滑块等变得更容易。

脚注-“初始化”UIView,UI "I“视图,

代码语言:javascript
复制
// UI "I" View ... "I" for initializing
// Simply saves you typing inits everywhere
import UIKit
class UIIView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        common()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        common()
    }
    func common() { }
}
票数 4
EN

Stack Overflow用户

发布于 2017-05-02 14:13:56

Use below code for Swift 5.0

第1步:从故事板中提取一个UIView,将其拖到ViewController文件中并创建IBOutlet of UIView。

代码语言:javascript
复制
@IBOutlet weak var viewDrag: UIView!
var panGesture = UIPanGestureRecognizer()

第2步:在viewDidLoad()中添加以下代码。

代码语言:javascript
复制
override func viewDidLoad() {
super.viewDidLoad()
  let panGesture = UIPanGestureRecognizer(target: self, action:(Selector(("draggedView:"))))
  viewDrag.isUserInteractionEnabled = true
  viewDrag.addGestureRecognizer(panGesture)
}

第3步:创建UIView并添加代码来移动函数,如下所示。

代码语言:javascript
复制
func draggedView(sender:UIPanGestureRecognizer){
    self.view.bringSubviewToFront(viewDrag)
    let translation = sender.translation(in: self.view)
    viewDrag.center = CGPoint(x: viewDrag.center.x + translation.x, y: viewDrag.center.y + translation.y)
    sender.setTranslation(CGPoint.zero, in: self.view)
}

希望这能帮助到一些人。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43714948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档