UIDynamicItemBehavior.density не влияет на физику объекта в UIFieldBehavior? - PullRequest
0 голосов
/ 31 октября 2018

Я изучаю UIDynamicAnimator (очень круто!) И настроил тестовый проект. У меня все работает, но не похоже, что плотность моих объектов учитывается в физике UIFieldBehavior.linearGravityField (_ :).

В документации к UIDynamicItemBehavior.density говорится:

Относительная плотность динамического элемента вместе с его размером определяет его эффективную массу, когда он участвует в поведении UIKit Dynamics

И документы для UIFieldBehavior.linearGravityField (_:):

Это поле создает направленную гравитационную силу, которая равномерно применяется ко всем динамическим предметам с массой.

И

Сила для данного предмета может быть определена уравнением F = ma, где сила равна массе предмета, умноженной на ускорение, вызванное гравитационным полем, которое с этим типом поля является постоянным.

Итак, мое понимание того, что плотность, которую я придаю предметам, должно влиять на их физику. Этого не происходит - все они падают с одинаковой скоростью:

Density Borkage

Вот мой код.

Главный ВК:

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])

Что я упускаю или не понимаю? Мне нужна некоторая кажущаяся масса!

Спасибо ...

...