2

I'm looking at Apple documentation for UIPushBehavior and it confuses me in instantaneous mode. I know that the acceleration formula is Force = Mass * acceleration. I assume that mass of a view is width*height*density(1). The documentation describes push magnitude as follows:

The default magnitude is nil, equivalent to no force. A continuous force vector with a magnitude of 1.0, applied to a 100 point x 100 point view whose density value is 1.0, results in view acceleration of 100 points / second² in the direction indicated by the angle or pushDirection property.

This makes sense in terms of continuous pushing, where it provides constant acceleration. It does not say anything about intantaneous push. How can I understand what velocity an instantaneous push of magnitude 1 will provide to a 100x100 view?

4

2 回答 2

5

我最初赞成@HuguesBR 的回答,但现在我很遗憾,因为他的第一段是错误的(5 分钟后不能取消赞成)。

根据文件,

你用大小(magnitude)和弧度角(angle)来表达推动行为的力矢量。除了使用弧度角,您可以使用 pushDirection 属性等效地使用 x 和 y 分量来表示方向。无论您使用哪种方法,替代的等效值都会自动更新。

因此,如果您将pushDirection向量设置为(-1, 0),您将在调试中看到magnitude = 1angle = PI/2,反之亦然。

我在一个小型 xcode 项目中进行了实验UIPushBehaviorModeInstantaneous和模式,没有 定义. 我发现了奇怪的行为:UIPushBehaviorModeContinuousUIDynamicItemBehavior

UIPushBehaviorModeInstantaneous

  • 只对物体施加一次力,力就永远存在。
  • 默认情况下将其active属性设置为NO设置active属性以YES施加力!

    self.pushBehavior1.active = YES;
    self.pushBehavior1.active = YES;
    

    施力两次!(见编辑)

  • 一旦推送行为被激活,调用self.pushBehavior1.active = NO;什么也不做。

UIPushBehaviorModeContinuous

  • 对每一帧施加一个力到对象上。绝对是加速,但速度限制在大于瞬时速度...
  • active属性YES默认设置为,更改magnitude(或pushDirection)开始移动。
  • 浏览速度先是一按就慢了,但很快就超过了。

所以,为了回答@AlexStone,我在代码中测量了移动物体的速度,并立即推送到一个10100x100 视图将使物体的速度为100 点/秒(我观察到实际上是 99.8)densityresistance

编辑

Instantaneous模式下进行更多测试后,该active属性似乎YES默认设置为,但NO在模拟物理之后又回到帧的末尾。
的确,

self.pushBehavior.magnitude = 1;
[self.animator addBehavior:self.pushBehavior];

会产生运动。
要再次推送,只需执行以下操作:

self.pushBehavior.active = YES;
于 2016-03-10T15:05:05.720 回答
4

编辑:似乎@martin 有更好的答案。请检查一下。我还没有时间检查它。

在瞬时推动的情况下没有加速度(UIPushBehaviorModeInstantaneous)。然后因为你不能玩magnitude(它没有影响)。相反,您可以使用pushDirection向量值。IE。:

pushBehavior.pushDirection = CGVectorMake(100, 100);

你也可以添加一个UIDynamicItemBehavior直接作用于你移动的对象的行为,以便添加一些resistance, friction, ... 如果你想放慢速度

UIDynamicItemBehavior *resistanceBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[view]];
resistanceBehavior.resistance = 1.0;
[self.animator addBehavior:resistanceBehavior];
于 2015-07-31T18:19:36.543 回答