我试图理解UIDynamicAnimator
如何计算每次迭代的值。
例如,我有一个simpel示例,其中UIAttachmentBehavior
和UIDynamicItemBehavior
附加到同一个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
答案 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
。这个 允许动态为集合视图中的项目设置动画。
除了我在这里引用的内容之外,还有更多内容。我想,这是一篇关于这个主题的好读物。希望这有帮助!