使用UIKit Dynamics我希望以一种方式组合UIAttachmentBehavior和UICollisionBehavior,以便用户可以拖动视图(使用UIPanGestureRecognizer
)但不留下某个区域。
当用户/ UIView与碰撞行为的界限发生碰撞时,问题就出现了,因为没有垂直移动是可能的。
即。当与界限区域的左侧碰撞时,一个人在那里“卡住”并且不能向上或向下移动,恰好是正确的。将UIView拖回到用于去那里的确切路径上。
UIDynamicItemBehavior对此工作的任何帮助都非常受欢迎(尝试弹性,摩擦和阻力,但无济于事)。
答案 0 :(得分:1)
我认为您以错误的方式实施了UIPanGestureRecognizer
。请尝试以下示例。只需创建一个新项目并将此代码粘贴到ViewController中。如果您需要缩小可拖动区域,可以使用dragView
功能。
import UIKit
class ViewController: UIViewController, UICollisionBehaviorDelegate {
var collision: UICollisionBehavior!
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
let container = UIView(frame: CGRect(x: 30, y: 60, width: 300, height: 500))
self.view.addSubview(container)
container.backgroundColor = .gray
self.animator = UIDynamicAnimator(referenceView: container);
//self.animator.setValue(true, forKey: "debugEnabled")
let greenBox = UIView(frame: CGRect(x: 60, y: 240, width: 50, height: 50))
greenBox.backgroundColor = .green
container.addSubview(greenBox)
let blueBox = UIView(frame: CGRect(x: 10, y: 10, width: 50, height: 50))
blueBox.backgroundColor = .blue
container.addSubview(blueBox)
let redBox = UIView(frame: CGRect(x: 200, y: 300, width: 50, height: 50))
redBox.backgroundColor = .red
container.addSubview(redBox)
self.collision = UICollisionBehavior(items: [greenBox, blueBox, redBox])
self.collision.translatesReferenceBoundsIntoBoundary = true
self.collision.collisionMode = .everything
self.animator.addBehavior(self.collision)
self.collision.collisionDelegate = self
let c = UIDynamicItemBehavior(items: [redBox])
c.density = 10000
self.animator.addBehavior(c)
let noRotation = UIDynamicItemBehavior(items: [greenBox, blueBox])
noRotation.allowsRotation = false
self.animator.addBehavior(noRotation)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.dragView(_:)))
greenBox.isUserInteractionEnabled = true
greenBox.addGestureRecognizer(panGesture)
let panGesture2 = UIPanGestureRecognizer(target: self, action: #selector(self.dragView(_:)))
blueBox.isUserInteractionEnabled = true
blueBox.addGestureRecognizer(panGesture2)
}
@objc func dragView(_ sender:UIPanGestureRecognizer){
if let viewDrag = sender.view {
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)
animator.updateItem(usingCurrentState: viewDrag)
}
}
}