可拖动的UIView Swift 3

Dpe*_*rov 18 xcode animation ios swift swift3

我希望能够在屏幕上拖动对象,但他们不会.我尝试了一切,但仍然不能.

这是代码.

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

他们也有引力.形式是正方形和圆形.

说明:在.began中 - 我禁用所选表单的重力.在.changed中 - 我试着改变坐标.在.end - 我再次启用引力.

屏幕截图.

在此输入图像描述

在此输入图像描述

Kir*_*odi 77

第1步:在storyBoard中选择一个要拖动的视图.

@IBOutlet weak var viewDrag: UIView!
Run Code Online (Sandbox Code Playgroud)

第2步:添加PanGesture.

var panGesture       = UIPanGestureRecognizer()
Run Code Online (Sandbox Code Playgroud)

第3步:在ViewDidLoad中添加以下代码.

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Run Code Online (Sandbox Code Playgroud)

第4步: draggedView的代码.

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)
}
Run Code Online (Sandbox Code Playgroud)

第5步:输出.

GIF

  • 对于 swift 4,我们需要将 @obj 添加到 DraggedView (2认同)

Fat*_*tie 8

如果您对视图进行子类化,则非常容易:

可拖动视图...

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)
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在场景中放置一个 UIView。

  2. 正常情况下,从左侧(即 x 位置)添加约束,并从顶部(即 y 位置)添加约束。

  3. 在故事板中,只需将约束命名为“fromleft”和“fromtop”

在此输入图像描述

你完成了。

现在它可以完美运行 - 就是这样。

constraint(那个方便的电话是什么?

请注意,视图只是通过 name 找到它自己的约束

在 Xcode 中,仍然无法使用 IBOutlets 等约束。幸运的是,通过“标识符”很容易找到它们。.identifier(事实上​​,这就是约束特征的真正目的。)

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

提示...边缘与中心!

不要忘记对视图进行约束时(如上图所示):

您可以将左侧设置为:

  • 到白框的左边缘,或者,
  • 到白色盒子的中心。

选择适合您情况的正确选项。它将使计算、设置滑块等变得更加容易。


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

// 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() { }
}
Run Code Online (Sandbox Code Playgroud)


Dil*_*ari 6

Use below code for Swift 5.0

第 1 步:从 Storyboard 中取出一个 UIView,将其拖到 ViewController 文件中并创建 UIView 的 IBOutlet。

@IBOutlet weak var viewDrag: UIView!
var panGesture = UIPanGestureRecognizer()
Run Code Online (Sandbox Code Playgroud)

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

override func viewDidLoad() {
super.viewDidLoad()
  let panGesture = UIPanGestureRecognizer(target: self, action:(Selector(("draggedView:"))))
  viewDrag.isUserInteractionEnabled = true
  viewDrag.addGestureRecognizer(panGesture)
}
Run Code Online (Sandbox Code Playgroud)

步骤 3:创建 func 并添加代码以移动 UIView,如下所示。

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)
}
Run Code Online (Sandbox Code Playgroud)

希望这会对某人有所帮助。