如何正确使用CollisionBehavior使物品相互碰撞
How to use CollisionBehavior properly to bring items to collide with each other
对你来说可能很简单。
我只是想以正确的方式使用碰撞模式。我的代码似乎没问题(没有错误),但项目只与视图的边界发生冲突。不是彼此。
我想知道 "translatesReferenceBoundsIntoBoundary" 是否会覆盖碰撞模式。
也许我应该使用 "addBoundary(withIdentifier:NSCopying, from: CGPoint, to:CGPoint)" 方法而不是 "translateReferenceBoundsIntoBoundary" 但没有找到如何实现 NSCopying class.
详情请看我的代码。
提前致谢。
import UIKit
class ViewController: UIViewController {
var tests:[String] = ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11"]
var label:UILabel!
var color:UIColor!
var dynamicBehavior:UIDynamicBehavior!
var collisionBehavior:UICollisionBehavior!
var animatorArray = [UIDynamicAnimator]()
var countLabel = 0
override func viewDidLoad() {
super.viewDidLoad()
let size:CGFloat = 50.0
var positionX:CGFloat = 60.0
var positionY:CGFloat = 100.0
for test in tests {
label = UILabel(frame:CGRect(x: positionX, y: positionY, width: size, height: size))
label.center = CGPoint(x: positionX, y: positionY)
label.layer.cornerRadius = size * 0.5
label.layer.masksToBounds = true
label.backgroundColor = color
label.textAlignment = .center
label.textColor = UIColor.white
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 1
label.text = test
self.view.addSubview(label)
countLabel = countLabel + 1
if countLabel == 4 || countLabel == 8 {
positionX = positionX - 140
positionY = positionY + 100 }
else { positionX = positionX + 60}
for (i,_) in tests.enumerated() {
let gravity = UIGravityBehavior(items: [label])
let direction = CGVector(dx: 0.0, dy: 1.0)
gravity.gravityDirection = direction
let bounce = UIDynamicItemBehavior(items: [label])
bounce.elasticity = 1.0
let collisions = UICollisionBehavior(items: [label])
collisions.translatesReferenceBoundsIntoBoundary = true
collisions.collisionMode = UICollisionBehaviorMode.everything
animatorArray.append(UIDynamicAnimator(referenceView: self.view))
animatorArray[i].addBehavior(bounce)
animatorArray[i].addBehavior(collisions)
animatorArray[i].addBehavior(gravity)
}
}
}
}
您的每个标签都被添加到一个单独的 UIDynamicAnimator
实例中,其中包含您的 for 循环中所有行为的单独实例。您可以只制作一个 属性 动画师和每个行为,并将每个标签添加到相同的动画师和行为。这样动画师就可以负责所有标签,而不仅仅是一个。
对你来说可能很简单。
我只是想以正确的方式使用碰撞模式。我的代码似乎没问题(没有错误),但项目只与视图的边界发生冲突。不是彼此。
我想知道 "translatesReferenceBoundsIntoBoundary" 是否会覆盖碰撞模式。
也许我应该使用 "addBoundary(withIdentifier:NSCopying, from: CGPoint, to:CGPoint)" 方法而不是 "translateReferenceBoundsIntoBoundary" 但没有找到如何实现 NSCopying class.
详情请看我的代码。
提前致谢。
import UIKit
class ViewController: UIViewController {
var tests:[String] = ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11"]
var label:UILabel!
var color:UIColor!
var dynamicBehavior:UIDynamicBehavior!
var collisionBehavior:UICollisionBehavior!
var animatorArray = [UIDynamicAnimator]()
var countLabel = 0
override func viewDidLoad() {
super.viewDidLoad()
let size:CGFloat = 50.0
var positionX:CGFloat = 60.0
var positionY:CGFloat = 100.0
for test in tests {
label = UILabel(frame:CGRect(x: positionX, y: positionY, width: size, height: size))
label.center = CGPoint(x: positionX, y: positionY)
label.layer.cornerRadius = size * 0.5
label.layer.masksToBounds = true
label.backgroundColor = color
label.textAlignment = .center
label.textColor = UIColor.white
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 1
label.text = test
self.view.addSubview(label)
countLabel = countLabel + 1
if countLabel == 4 || countLabel == 8 {
positionX = positionX - 140
positionY = positionY + 100 }
else { positionX = positionX + 60}
for (i,_) in tests.enumerated() {
let gravity = UIGravityBehavior(items: [label])
let direction = CGVector(dx: 0.0, dy: 1.0)
gravity.gravityDirection = direction
let bounce = UIDynamicItemBehavior(items: [label])
bounce.elasticity = 1.0
let collisions = UICollisionBehavior(items: [label])
collisions.translatesReferenceBoundsIntoBoundary = true
collisions.collisionMode = UICollisionBehaviorMode.everything
animatorArray.append(UIDynamicAnimator(referenceView: self.view))
animatorArray[i].addBehavior(bounce)
animatorArray[i].addBehavior(collisions)
animatorArray[i].addBehavior(gravity)
}
}
}
}
您的每个标签都被添加到一个单独的 UIDynamicAnimator
实例中,其中包含您的 for 循环中所有行为的单独实例。您可以只制作一个 属性 动画师和每个行为,并将每个标签添加到相同的动画师和行为。这样动画师就可以负责所有标签,而不仅仅是一个。