首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该removeBehavior一个UIPushBehavior吗?--我正在增加许多推送。

我应该removeBehavior一个UIPushBehavior吗?--我正在增加许多推送。
EN

Stack Overflow用户
提问于 2014-09-03 14:23:48
回答 1查看 1.1K关注 0票数 2

我有一个小UIView,它能在盒子里弹跳。我正在添加一个瞬时模式。推。事实上,我增加了很多推杆

神秘:

(1)如果是这样的话,我必须要removeBehavior????吗?什么时候?!“在”瞬间“之后?

(2)是否UIPushBehaviorModeInstantaneous是特例,而您不需要(或不能)移除这些?

(3)当你addBehavior:那..。保留?!UIPushBehavior?或者?见鬼?!

(4)我似乎在任何地方都找不到这些方面的文档!

代码语言:javascript
复制
-(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,基本上是完美的。

再次,经过大量测试后,我们强烈建议,下面的代码实际上是“解决方案”,是代码重复推送的唯一方法。谢天谢地罗布:/

代码语言:javascript
复制
-(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];
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-03 19:29:35

在回答你的问题时:

  1. 是的,您添加的UIPushBehavior是正确的。
  2. 从技术上讲,您不必调用removeBehavior进行瞬时推送,因为该行为将在瞬时推送发生时立即关闭其active状态。 话虽如此,我还是倾向于删除这些行为,因为您正在占用内存,而动画师则对这些非active瞬时推送行为保持了强烈的引用。(这很容易通过记录动画器的behaviors属性来验证,该属性是它正在跟踪的所有行为的数组。)最终可能会出现一个与性能相关的问题,即迭代所有这些非active行为,尽管我怀疑对内存的关注可能更有意义。 但是,不像其他行为(例如UISnapBehavior)保持active,您不必担心挥之不去的瞬时推送行为会继续影响添加到其中的项目。
  3. 它们本身不会“过期”,但是,是的,它们很快就会进入active状态NO
  4. 是的,当您向动画器添加行为时,动画师将保持对它的强烈引用,直到您删除该行为为止。

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

代码语言:javascript
复制
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [self.animator removeBehavior:push];
});

或者,您可以设置一个为您删除它的action

代码语言:javascript
复制
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];
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25646857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档