gpt4 book ai didi

ios - 结合 UIAttachmentBehavior 和 UICollisionBehavior

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:01 27 4
gpt4 key购买 nike

我想使用 UIKit Dynamics 组合 UIAttachmentBehavior 和 UICollisionBehavior,以便用户可以拖动 View (使用 UIPanGestureRecognizer)但不会离开特定区域。

当用户/UIView 与碰撞行为的边界发生碰撞时,问题就出现了,因为此时不可能进行垂直移动。

即当与边界区域的左侧发生碰撞时,一个人会“卡住”在那里,不能上下移动,就在右边。将 UIView 拖回原来的路径。

非常感谢 UIDynamicItemBehavior 解决此问题的任何帮助(尝试了弹性、摩擦和阻力,但无济于事)。

enter image description here

最佳答案

我认为您以错误的方式实现了 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)
}
}

}

关于ios - 结合 UIAttachmentBehavior 和 UICollisionBehavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30956577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com