我有一个在盒子里弹跳的小UIView。我正在添加一个瞬时模式。推。事实上,我正在添加很多推送 - 5或更多赫兹。
神秘:
(1( 我必须删除行为吗???? 㞖。。什么时候?!? "之后"一个"瞬间"?
(2(UIPushBehaviorModeInstantaneous是一个特例,你不必(或不能(删除它们吗?
(3(当你添加行为时:这..保留吗?!UIPushBehavior? 或?? 跆拳道?!
(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];
}
{注意:每次需要时,我只需分配UIPushBehavior。请注意,如果您尝试使用"只有一个"作为属性,则它不起作用。事实上,Rob在下面解释了原因。
溶液
经过极其广泛的测试,我们发现 Rob 的"第二种"解决方案,使用 .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];
}
}
回答您的问题:
-
是的,您正确地添加了该
UIPushBehavior
。 -
从技术上讲,您不必为即时推送调用
removeBehavior
,因为一旦发生瞬时推送,该行为的active
状态就会关闭。话虽如此,我倾向于删除该行为,因为否则您会占用内存,而动画师会保留对这些非
active
即时推送行为的强烈引用。(这可以通过记录动画师的behaviors
属性轻松验证,该属性是它正在跟踪的所有行为的数组。最终可能会有一个与性能相关的问题,因为它会遍历所有这些非active
行为,尽管我怀疑内存问题可能更有意义。但与其他行为不同(例如
UISnapBehavior
active
(,您不必担心挥之不去的瞬时推送行为会继续影响添加它的项目。
它们 本身不会"过期",但是,是的,它们很快就会进入
NO
active
状态.
是的,当您向动画器添加行为时,动画器将保持对该行为的强引用,直到您删除该行为。
就个人而言,我倾向于在添加后删除该行为。因为它是即时的,所以删除它的时间并不是非常关键,你可以做一些简单的事情,比如:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self.animator removeBehavior:push];
});
或者,您可以设置一个action
为您删除它。
UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:self.items mode:UIPushBehaviorModeInstantaneous];
push.pushDirection = ...
UIPushBehavior __weak *weakPush = push; // avoid strong reference cycle
push.action = ^{
if (!weakPush.active) {
[self.animator removeBehavior:weakPush];
}
};
[self.animator addBehavior:push];