Я изучаю UIDynamicAnimator (очень круто!) И настроил тестовый проект. У меня все работает, но не похоже, что плотность моих объектов учитывается в физике UIFieldBehavior.linearGravityField (_ :).
В документации к UIDynamicItemBehavior.density говорится:
Относительная плотность динамического элемента вместе с его размером определяет его эффективную массу, когда он участвует в поведении UIKit Dynamics
И документы для 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])
Что я упускаю или не понимаю? Мне нужна некоторая кажущаяся масса!
Спасибо ...