- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 CAEmitterLayer
的 emitterPosition
设置动画,如下所示:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"emitterPosition.x"] ;
animation.toValue = (id) toValue ;
animation.removedOnCompletion = NO ;
animation.duration = self.translationDuration ;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ;
animation.completion = ^(BOOL finished)
{
[self animateToOtherSide] ;
} ;
[_emitterLayer addAnimation:animation forKey:@"emitterPosition"] ;
CGPoint newEmitterPosition = CGPointMake(toValue.floatValue, self.bounds.size.height/2.0) ;
_emitterLayer.emitterPosition = newEmitterPosition ;
请注意,animation.completion
是在仅调用相应的 CAAnimation
委托(delegate)方法的类别中声明的。
问题是它根本没有动画,而是在其最终位置显示发射器。我的印象是,一旦将动画添加到图层,就应该将其背后的实际模型更改为最终位置,以便动画完成时模型处于最终状态;即,防止动画“弹回到”其原始位置。
我已经尝试将最后两行放在 animation.completion
block 中,这确实按预期进行了动画处理。但是,当动画结束时,一些粒子会间歇性地在发射器的原始位置发射。如果您将系统置于负载之下(例如,在播放动画时滚动 tableview),这种情况会更频繁地发生。
我正在考虑的另一个解决方案是根本不移动 emitterPosition
而只是移动 CAEmitterLayer
本身,尽管我还没有尝试过。
在此先感谢您提供的任何帮助。
最佳答案
也许 emitterPosition.x
不是动画的有效关键路径。尝试改用 emitterPosition
(因此您必须提供包含在 NSValue 中的 CGPoint 值)。
我刚刚在我自己的机器上试过了,它工作正常:
CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"emitterPosition"];
ba.fromValue = [NSValue valueWithCGPoint:CGPointMake(30,100)];
ba.toValue = [NSValue valueWithCGPoint:CGPointMake(200,100)];
ba.duration = 6;
ba.autoreverses = YES;
ba.repeatCount = HUGE_VALF;
[emit addAnimation:ba forKey:nil];
其他需要考虑的事情:
您通常可以使用 nil 作为 addAnimation:forKey:
中的键,除非您稍后需要找到此动画(例如删除它或以某种方式覆盖它).关键路径是关键。
将 removedOnCompletion
设置为 NO 几乎总是错误的,并且通常是无赖的最后避难所(即由于不了解动画的工作原理)。
如果像您所说的那样,在完成 block 内设置 _emitterLayer.emitterPosition = newEmitterPosition
确实会设置动画,那么您什么时候才使用 CABasicAnimation?为什么不直接调用 UIView animate...
并在动画 block 中设置 emitterPosition?如果可行,它会用一 block 石头杀死两只鸟,移动位置并为其设置动画。
关于ios - 动画 CAEmitterLayer 的 emitterPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653367/
所以我使用 CAEmitterLayer 开发了一个应用程序。最初我让它自动发射(当应用程序加载时,它将开始发射 Spark ),它在模拟器和设备中都工作得很好。 现在,我将其更改为当用户点击屏幕时发
我只想运行一次 CAEmitterLayer,我想停止birthRate,但我做不到。我想要的是它在点击屏幕时只运行一次。我一直在尝试与代表合作,但我无法让它发挥作用。你能告诉我我的代码是否有效。
我有一个 CAEmitterLayer 实例,它发出一些 CAEmitterCells。我想知道,是否可以暂停这一层,这样就不会产生新的 CAEmitterCells 并且已经产生的那些在屏幕上的位置
我只是将 UIView 添加到我的 storyboard view controller,然后创建一个 UIView 类来显示粒子效果。我将 UIView 的 类名称更改为我创建的自定义类的名称。我在
我正在努力创建一个与屏幕高度相同的 CAEmitterLayer,并推离 -X,因此 CAEmitterCells 从左侧(离开屏幕)移动到右上角。 我遇到了一个问题,CAEmitterLayer 的
我有一个 CAEmitterLayer 实例,我想暂停然后恢复多次。 我已经找到了多种使用两个 CAEmitterLayer 扩展函数来实现这一点的方法: public func pause() {
我正在使用 Apple 的 CAEmitterLayer 和 CAEmitterCell 设计一个粒子系统,在 iPhone5 和模拟器上一切都很顺利。但是一旦我在 iPhone4S 上运行它,粒子系
我在 iOS 中使用 CAEmitterLayer 玩粒子系统(就像在 this example 中一样),但我无法在需要时移除粒子。 我正在尝试以下代码,但它不起作用: [self.emitterL
我正在尝试重新创建此效果(请参见下图),但是具有圆形路径,因为我有一个圆形按钮。 这是来源。 https://github.com/uiue/ParticleButton/blob/master/Pa
在 iPad 版 Swift Playgrounds 中,我很难将 CAEmitterLayer 实例永久限制在中心。例如,它保持居中直到设备旋转,因此我需要找到某种方法将其限制在所有设备方向的中心。
我想在用户猜对后制作五彩纸屑效果,我在网上搜索了一些看起来不错的东西,但是它只有.m文件,我不知道如何处理头文件。 This is the link to the page with the Conf
我想在矩形内制作粒子。 这段代码有什么问题?它仅从发射器位置发射,而不是矩形中的随机位置。 fireEmitter = [CAEmitterLayer layer]; [self.view.layer
我已经阅读了一些教程并查看了文档,但我无法让我的 CAEmitterLayer 显示任何粒子。我有一个 CAEmitterLayer 和 CAEmitterCell 属性,它们都具有 nonatomi
我有以下代码,将粒子添加到位于其他一些 UIView 中心的名为 ParentView 的 UIView: CAEmitterLayer *emitterLayer = [CAEmitterLayer
我想创建一个树叶飘落的动画这是我的代码: private func setupEmitter() { let size = self.bounds.size let emitter
我似乎无法解决的奇怪问题仅在 iOS 7 上,当出生率最初设置为非零值时,CAEmitterLayer 会在屏幕上错误地生成粒子.就好像它计算了层在未来的状态。 // Create black ima
我正在尝试设置一个 CAEmitterLayer 来制作五彩纸屑效果,我遇到了两个问题: 每当我将单元格上的 birthRate 设置为非零值以启动动画时,我都会在屏幕上随机放置一系列单元格,这些单元
有什么想法为什么仅使用带有 CAEmitterLayer 子层的普通 ScreenSaverView 子类的屏幕保护程序会在主屏幕上渲染良好并且断断续续(就好像每 2. 帧渲染一样)在那里..)在辅助
我正在尝试为 CAEmitterLayer 的 emitterPosition 设置动画,如下所示: CABasicAnimation *animation = [CABasicAnimation a
我们一直看到的一个非常奇怪的问题(下面的 gif), 我们有一个呈现的 View Controller ,它有一个 TeamBadgeView,这是一个以 CAEmitterCells 形式发出表情符
我是一名优秀的程序员,十分优秀!