2

我有一个小 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 。请注意,如果您尝试使用“just one”作为属性,则它不起作用。事实上,Rob 在下面解释了原因。}


解决方案

经过极其广泛的测试,我们发现 Rob 使用 .action 的“第二种”解决方案基本上是完美的。

再次经过大量测试后,我们强烈建议以下代码确实是“解决方案”,是编写重复推送的唯一方法。感谢 Rob:/

-(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];
        }
    }
4

1 回答 1

6

在回答您的问题时:

  1. 是的,您添加的UIPushBehavior正确。

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

    话虽如此,我倾向于删除该行为,因为否则您会占用内存,而动画师会强烈引用这些非active瞬时推动行为。(这很容易通过记录动画师的behaviors属性来验证,该属性是它正在跟踪的所有行为的数组。)尽管它最终也可能会出现与性能相关的问题来遍历所有这些非active行为我怀疑内存问题可能更重要。

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

  3. 它们本身不会“过期” ,但是,是的,它们很快就会active进入NO.

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

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

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];
于 2014-09-03T19:29:35.017 回答