【问题标题】:Initial particles from CAEmitterLayer don't start at emitterPositionCAEmitterLayer 的初始粒子不在emitterPosition 开始
【发布时间】:2015-05-01 20:01:16
【问题描述】:

我的目标是制作一个类似爆炸的动画,其中许多粒子在短时间内发射。我的问题是 CAEmitterLayer 在开始发射时会添加“未来”粒子以使其看起来动画已经运行了一段时间。

如何禁用或解决此问题?当我增加birthRate 时,我只希望粒子从emitterPosition 开始出现,而不是在CAEmitterCell 的预计生命周期的所有点上。任何帮助表示赞赏。

#import "EmitterView.h"

@interface EmitterView ()

@property CAEmitterLayer* emitter;

@end

@implementation EmitterView

- (void) awakeFromNib {
    [super awakeFromNib];
    self.emitter = (CAEmitterLayer*)self.layer;

    CAEmitterCell* snowflake = [CAEmitterCell emitterCell];
    snowflake.contents = (id)[[UIImage imageNamed: @"snowflake"] CGImage];
    snowflake.lifetime = 3;
    snowflake.birthRate = 1;
    snowflake.velocity = 50;
    snowflake.emissionRange = 3.1415;

    self.emitter.birthRate = 0;
    self.emitter.emitterCells = [NSArray arrayWithObject: snowflake];
    self.emitter.emitterPosition = CGPointMake(100, 100);
    self.emitter.emitterSize = CGSizeMake(0, 0);
    self.emitter.emitterShape = kCAEmitterLayerPoint;
}

+ (Class) layerClass {
    return [CAEmitterLayer class];
}

- (void) burst {
    self.emitter.birthRate = 10;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.emitter.birthRate = 0;
    });
}

@end

【问题讨论】:

    标签: ios caemitterlayer caemittercell


    【解决方案1】:

    这种行为实际上随着 iOS 7 的发布而改变,并且显然从那时起就再也没有回来过。在 iOS 7 之前,它的行为方式与您预期的一样,但要么 Apple 引入了导致此问题的错误,要么他们选择在不告诉任何人的情况下更改行为。

    我在 2013 年 8 月 28 日针对这个确切的问题提交了一个错误,该错误作为同一问题的另一个错误报告的副本被关闭。 Apple 的 bug 报告员报告说另一个 bug 仍然存在,这意味着 Apple 尚未解决它,尽管已经有一年半的时间来处理它。

    我建议您向 Apple 提交您自己的错误报告,给他们一个简单的应用程序来演示该行为,也许重新关注它会帮助他们采取一些措施。

    编辑:

    稍微研究了一下这个问题,我发现解决方案是添加这一行:

    self.emitter.beginTime = CACurrentMediaTime();
    

    重要的是要知道CAEmitterLayerCALayer 的子类,它符合CAMediaTiming 协议。为什么整个事实没有得到更好的记录,这超出了我的理解。

    请注意,您可能希望从您的 - (void)burst 方法中调用它,但是如果您在短时间内再次调用它,而之前的粒子仍然存在,您可能会看到一些奇怪的行为,因为重置beginTime.

    【讨论】:

    • 感谢您的快速回复!
    • @WaltersGE1 我发现了更多信息,这实际上应该有所帮助。显然,Apple 在记录一些非常重要的事情方面非常糟糕......
    • 我会试试这个。谢谢!
    • 我试过了,效果很好。唯一的问题是,当然,它会重置以前的“爆炸粒子”。如果我需要这个,我会使用多个 CAEmitterLayers。
    • 有了这条线,我的动画开始像 3 次发布一样开始工作,非常奇怪......但是这条线确实可以完成这项工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多