我有一个小UIView在一个盒子里弹跳。我正在添加一个瞬时模式。推。事实上,我添加了很多推 - 5赫兹或更多。我应该removeBehavior一个UIPushBehavior - 我加入很多推
奥秘:
(1)我必须removeBehavior ???? if if .. when?!? “之后”一个“瞬间”? (2)是否UIPushBehaviorModeInstantaneous是一个特殊情况,并且您不必(或不能)删除这些??????????????????????????UIPushBehaviorModeInstantaneous是一种特殊情况,您不必(也不能)
(3)当你addBehavior:那..保留?! UIPushBehavior?要么?? WTF?
(4)我似乎无法在任何地方找到这些方面!
-(void)pushMeRight:(CGFloat)mag
{
if (self.bounceAnimator == nil) return;
NSLog(@"...........push me right %.2f", mag);
UIPushBehavior *pushRight = [[UIPushBehavior alloc]
initWithItems:@[self]
mode:UIPushBehaviorModeInstantaneous];
pushRight.magnitude = mag;
pushRight.angle = radians(0); // (NB, 0 is right, 90 is down)
[self.bounceAnimator addBehavior:pushRight];
}
{注:我只是每次我需要一个ALLOC的UIPushBehavior 。请注意,如果您尝试使用“只有一个”作为属性,那么不起作用。事实上,罗布解释了为什么下面。}
解决方案
后极其广泛的测试,我们发现,罗布的“第二”的解决方案,使用.action,基本上是完美的。
同样庞大的测试后,我们会非常强烈建议下面的代码,是的,真的,“解决方案”,只有这样,才能编写重复推..谢天谢地罗布:/
-(void)pushAllUp:(CGFloat)mag
{
if (self.bounceAnimator == nil) return;
for (UIView *pushme in self.subviews)
{
UIPushBehavior *pp =
[[UIPushBehavior alloc]initWithItems:@[ pushme ]
mode:UIPushBehaviorModeInstantaneous];
pp.magnitude = mag;
pp.angle = radians(270); // (NB, 0 is right, 90 is down)
UIPushBehavior __weak *weakPP = pp;
pp.action = ^{ if (!weakPP.active)
[self.bounceAnimator removeBehavior:weakPP];};
[self.bounceAnimator addBehavior:pp];
}
}
感谢您的支持!我必须做一些测试,看看你什么时候可以消除这种行为:这种行为是否发生在那行代码上,然后呢?或者仅在例程结束时(或者更像是一个框架驱动的游戏引擎)。我会发现... – Fattie 2014-09-08 14:48:08
动画师不会执行行为,直到您将主线程退回到运行循环(即您的例程退出)。所以,确保你永远不会阻塞主线程。 (这是一条通用规则,因此请确保您避免在任何时候阻止主线程,否则您将对动画制作者执行动画的能力产生不利影响。)但是,您必须等待动画制作人员拿起行为就是为什么你不只是立即删除行为,而是异步地删除它(即在一些延迟或更好的时候,当'action'块被调用时)。 – Rob 2014-09-08 15:22:11
好的,你已经回答了这个问题 - 太棒了! – Fattie 2014-09-08 15:27:25