我正在查看UIPushBehavior的苹果文档,它在即时模式下让我感到困惑。我知道加速度公式是力=质量*加速度。我假设视图的质量是宽度*高度*密度(1)。文件对推力大小的描述如下:
默认大小为零,相当于没有力。连续大小为1.0的力矢量,应用于100点x 100密度值为1.0的点视图,导致视图加速度为在角度或pushDirection属性。
这在持续推动方面是有意义的,因为它提供了恒定的加速度。它没有说明任何关于非即时推动的内容我如何理解1级的瞬时推力将为100x100视图提供多大的速度
我最初对@HuguesBR的回答投了赞成票,但现在我很后悔,因为他的第一段错了(5分钟后无法取消赞成票)。
根据文件,
可以用大小(幅值)和弧度角度(角度)来表示推送行为的力向量您可以使用pushDirection属性,使用x和y分量等效地表示方向,而不是使用弧度。无论使用哪种方法,替换的等效值都会自动更新。
因此,如果您将pushDirection
向量设置为(-1, 0)
,您将在调试magnitude = 1
和angle = PI/2
时看到,反之亦然。
我在一个小型xcode项目中试验了UIPushBehaviorModeInstantaneous
和UIPushBehaviorModeContinuous
模式,没有UIDynamicItemBehavior
定义。我发现了一些奇怪的行为:
UIPushBehaviorModeInstantaneous
:
- 只要一个力作用在物体上一次,这个力就会永远存在
-
将其将active
属性默认设置为NO
active
属性设置为YES
将应用力和self.pushBehavior1.active = YES; self.pushBehavior1.active = YES;
用力两次 (参见编辑)
-
一旦推送行为被激活,调用
self.pushBehavior1.active = NO;
将不起任何作用。
UIPushBehaviorModeContinuous
:
- 对每帧对象施加一个力。它绝对是和加速度,但速度上限大于瞬时速度
- 默认情况下,
active
属性设置为YES
,更改magnitude
(或pushDirection
)将启动移动 - 观看速度首先比被推的那一刻慢,但很快就超过了它
因此,为了回答@AlexStone的问题,我用代码测量了移动物体的速度,并用density
为1和resistance
为0的瞬间推送100x100视图将使物体的速度达到100点/秒(事实上,我观察到大约99.8)
编辑:
在Instantaneous
模式下进行更多测试后,active
属性似乎默认设置为YES
,但在帧结束时,在物理模拟结束后返回到NO
事实上,
self.pushBehavior.magnitude = 1;
[self.animator addBehavior:self.pushBehavior];
将创建一个运动
要再次推送,只需执行:
self.pushBehavior.active = YES;
在瞬时推动(UIPushBehaviorModeInstantaneous
)的情况下没有加速度。那你就不能玩magnitude
了(没有影响)。相反,您可以使用pushDirection
矢量值。即:
pushBehavior.pushDirection = CGVectorMake(100, 100);
你也可以添加一个UIDynamicItemBehavior
来直接作用于你移动的物体的行为,以便添加一些resistance
、friction
。。。如果你想放慢的速度
UIDynamicItemBehavior *resistanceBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[view]];
resistanceBehavior.resistance = 1.0;
[self.animator addBehavior:resistanceBehavior];