我应该删除 UIPushBehavior 的行为吗 - 我正在添加许多推送



我有一个在盒子里弹跳的小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];
        }
    }

回答您的问题:

  1. 是的,您正确地添加了该UIPushBehavior

  2. 从技术上讲,您不必为即时推送调用removeBehavior,因为一旦发生瞬时推送,该行为的active状态就会关闭。

    话虽如此,我倾向于删除该行为,因为否则您会占用内存,而动画师会保留对这些非active即时推送行为的强烈引用。(这可以通过记录动画师的 behaviors 属性轻松验证,该属性是它正在跟踪的所有行为的数组。最终可能会有一个与性能相关的问题,因为它会遍历所有这些非active行为,尽管我怀疑内存问题可能更有意义。

    但与其他行为不同(例如 UISnapBehavior active(,您不必担心挥之不去的瞬时推送行为会继续影响添加它的项目。

  3. 它们
  4. 本身不会"过期",但是,是的,它们很快就会进入NO active状态.

  5. 是的,
  6. 当您向动画器添加行为时,动画器将保持对该行为的强引用,直到您删除该行为。

就个人而言,我倾向于在添加后删除该行为。因为它是即时的,所以删除它的时间并不是非常关键,你可以做一些简单的事情,比如:

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];

最新更新