1

我正在学习 UIDynamicAnimator(非常酷!)并建立了一个测试项目。我已经完成了工作,但在 UIFieldBehavior.linearGravityField(_:) 的物理特性中似乎没有考虑到我的对象的密度。

在 UIDynamicItemBehavior.density 的文档中它说:

动态项目的相对密度及其大小决定了它参与 UIKit 动态行为时的有效质量

以及 UIFieldBehavior.linearGravityField(_:) 的文档:

该场会产生一个定向引力,该引力均匀地应用于所有具有质量的动态项目。

给定物品上的力可以通过方程 F = ma 确定,其中力等于物品的质量乘以重力场施加的加速度,在这种类型的场中,重力场是恒定的。

所以我的理解是我赋予物品的密度应该会影响它们的物理特性。这不会发生 - 它们都以完全相同的速度下降:

密度租金

这是我的代码。

主要风投:

class MainViewController: UIViewController {
var item1: Item!
var item2: Item!
var item3: Item!

var animator: UIDynamicAnimator?
var collision: UICollisionBehavior?
var field: UIFieldBehavior?

override func viewDidLoad() {
    super.viewDidLoad()

    self.animator = UIDynamicAnimator(referenceView: self.view)
    self.animator?.isDebugEnabled = true

    self.collision = UICollisionBehavior()

    self.field = UIFieldBehavior.linearGravityField(direction: CGVector(dx: 0, dy: 1))
    field?.strength = 2.5

    self.collision?.translatesReferenceBoundsIntoBoundary = true

    if let collision = self.collision {
        self.animator?.addBehavior(collision)
    }

    if let field = self.field {
        self.animator?.addBehavior(field)
    }

    self.item1 = Item()
    self.item2 = Item()
    self.item3 = Item()

    self.item1.mainViewController = self
    self.item2.mainViewController = self
    self.item3.mainViewController = self

    self.item1.configure(x: 50, y: 50, density: 0.1)
    self.item2.configure(x: 150, y: 50, density: 100)
    self.item3.configure(x: 300, y: 50, density: 10000)

    self.animator?.behaviors.forEach( { behavior in
       print("")
       print(behavior)

    })        
}}

还有我用来创建对象以获取所有物理的 Item 类:

class Item: UIImageView {

var itemBehavior: UIDynamicItemBehavior!
var mainViewController: MainViewController?
var randomFloat: CGFloat {
    return CGFloat.random(in: 25...50)
}

func configure(x: CGFloat, y: CGFloat, density: CGFloat) {

    guard let mainViewController = self.mainViewController else {
        return
    }

    self.layer.backgroundColor = UIColor.red.cgColor

    self.layer.frame = CGRect(x: x, y: y, width: self.randomFloat, height: self.randomFloat)

    self.itemBehavior = UIDynamicItemBehavior()
    self.itemBehavior.density = density
    self.itemBehavior.elasticity = 0
    self.itemBehavior.allowsRotation = true
    self.itemBehavior.friction = 1
    self.itemBehavior.addItem(self)

    mainViewController.view.addSubview(self)

    mainViewController.field?.addItem(self)
    mainViewController.collision?.addItem(self)
    mainViewController.animator?.addBehavior(self.itemBehavior)

}}

在调试控制台中,我可以看到这些对象确实具有密度(分别为 0.1、100 和 10000),它似乎根本不影响事物:

<UICollisionBehavior: 0x600000949b00> (All) (Reference Bounds) (3 items: [iPhone_X_UI_test.Item:0x7fc5e9807f30, iPhone_X_UI_test.Item:0x7fc5e98085a0, iPhone_X_UI_test.Item:0x7fc5e98087e0])
<UIFieldBehavior: 0x6000018640a0>
<UIDynamicItemBehavior: 0x60000154d980> E=0.000000 F=1.000000 D=0.100000 (1 items: [iPhone_X_UI_test.Item:0x7fc5e9807f30])
<UIDynamicItemBehavior: 0x60000154db80> E=0.000000 F=1.000000 D=100.000000 (1 items: [iPhone_X_UI_test.Item:0x7fc5e98085a0])
<UIDynamicItemBehavior: 0x60000154dd00> E=0.000000 F=1.000000 D=10000.000000 (1 items: [iPhone_X_UI_test.Item:0x7fc5e98087e0])

我错过了什么或不理解什么?我需要一些明显的质量!

谢谢...

4

0 回答 0