了解UIDynamics如何计算位置

时间:2014-12-12 10:36:33

标签: ios uikit uikit-dynamics

我试图理解UIDynamicAnimator如何计算每次迭代的值。

例如,我有一个simpel示例,其中UIAttachmentBehaviorUIDynamicItemBehavior附加到同一个DynamicItem

UIAttachmentBehavior *attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:test attachedToAnchor:CGPointMake(50, 50)];
attachmentBehavior.frequency = 3.5;
attachmentBehavior.damping = .4;

UIDynamicItemBehavior *dynamicItemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[test]];
dynamicItemBehavior.resistance = 10;
dynamicItemBehavior.action = ^{
    NSLog(@"%f", [dynamicItemBehavior linearVelocityForItem:test]);
};

每当我更改UIAttachmentBehavior anchorPoint 时,它都会使用弹簧动画设置为该位置的动画。

我不明白DynamicItemBehavior如何知道这一运动,从而可以将其物理特性(阻力,密度等)应用于由不同行为触发的运动?

UIDynamicAnimator是否以某种方式确定并累积了所有行为(速度,阻尼等)的值。

在我的脑海里,它有点像

var velocity;

for behavior in item.behaviors
    velocity += behavior.velocity * behavior.damping    

item.position = delta_time * velocity

1 个答案:

答案 0 :(得分:1)

我不确定我完全明白你的要求,但我在几天前研究UIDynamics时遇到了这个问题。也许它可以帮助你:http://www.raywenderlich.com/76147/uikit-dynamics-tutorial-swift

在页面的大约一半时间,他谈到了在幕后如何计算行为:

  

动态行为的方法签名使用术语项   而不是观点。应用动态行为的唯一要求   一个对象是它采用UIDynamicItem协议,如下所示:   协议

UIDynamicItem : NSObjectProtocol {   
var center: CGPoint { get set }
var bounds: CGRect { get }
var transform: CGAffineTransform { get set } }
  

UIDynamicItem协议提供对中心和变换属性的动态读写访问,允许它根据内部计算移动项目。它还具有对边界的读访问权限,用于确定项目的大小。这允许它围绕物品的周边创建碰撞边界,并在力时计算物品的质量   适用。该协议意味着动力学不紧密耦合   到UIView;确实有另一个UIKit类不是视图而是   仍采用此protocol: UICollectionViewLayoutAttributes。这个   允许动态为集合视图中的项目设置动画。

除了我在这里引用的内容之外,还有更多内容。我想,这是一篇关于这个主题的好读物。希望这有帮助!