gpt4 book ai didi

ios - 我应该 removeBehavior 还是 UIPushBehavior——我添加了很多推送

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:15:50 25 4
gpt4 key购买 nike

我有一个在盒子里弹跳的小 UIView。我正在添加一个瞬时 模式。推。事实上,我添加了非常多的插入力——5 赫兹或更多。

谜团:

(1) 如果是这样,我是否必须removeBehavior????..何时?!? “在”“瞬间”之后?

(2) 是否 UIPushBehaviorModeInstantaneous 是一个特例,您不必(或不能)删除它们?

(3) 当你 addBehavior: does that .. retain?! UIPush 行为?或者??什么鬼?!

(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 的“第二个”解决方案本质上是完美的。

再次经过大量测试后,我们强烈建议以下代码确实是“解决方案”,这是对重复推送进行编码的唯一方法。感谢 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];
}
}

最佳答案

回答您的问题:

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

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

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

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

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

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

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

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self.animator removeBehavior:push];
});

或者,您可以设置一个操作来为您删除它。

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

关于ios - 我应该 removeBehavior 还是 UIPushBehavior——我添加了很多推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com