我希望能够拖动屏幕上的对象,但它们不能。我什么都试过了,但还是不行。
以下是代码。
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。


发布于 2017-05-01 14:04:33
第1步:获取要在storyBoard中拖动的一个视图。
@IBOutlet weak var viewDrag: UIView!第2步:添加PanGesture。
var panGesture = UIPanGestureRecognizer()第3步:在ViewDidLoad中使用添加以下代码。
override func viewDidLoad() {
super.viewDidLoad()
panGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:)))
viewDrag.isUserInteractionEnabled = true
viewDrag.addGestureRecognizer(panGesture)
}第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)
}步骤5 :输出。

发布于 2020-05-21 22:21:47
如果你子类化一个视图,这是非常简单的:
DraggableView...
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)
}
}故事板中的

你的任务完成了。
它现在可以完美地工作了--就是这样。
那个方便的constraint(调用是什么?
请注意,视图中的只是通过名称找到自己的约束。
在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
}
}Tip...edge对阵中锋!
不要忘记在视图上设置约束时(如上图所示):
您可以将左边的设置为:
白盒左边缘的
根据您的情况选择正确的解决方案。它将使计算、设置滑块等变得更容易。
脚注-“初始化”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() { }
}发布于 2017-05-02 14:13:56
Use below code for Swift 5.0
第1步:从故事板中提取一个UIView,将其拖到ViewController文件中并创建IBOutlet of UIView。
@IBOutlet weak var viewDrag: UIView!
var panGesture = UIPanGestureRecognizer()第2步:在viewDidLoad()中添加以下代码。
override func viewDidLoad() {
super.viewDidLoad()
let panGesture = UIPanGestureRecognizer(target: self, action:(Selector(("draggedView:"))))
viewDrag.isUserInteractionEnabled = true
viewDrag.addGestureRecognizer(panGesture)
}第3步:创建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)
}希望这能帮助到一些人。
https://stackoverflow.com/questions/43714948
复制相似问题