需要有关多层动画位置的帮助
Posted
技术标签:
【中文标题】需要有关多层动画位置的帮助【英文标题】:Need help regarding animating position of multiple layers 【发布时间】:2014-05-03 06:17:02 【问题描述】:我正在尝试为实际上是图像的气球制作动画。为此,我创建了 CALayer 的子类,它在其内容中显示图像,最后该子类的多个对象将添加到 viewcontroller 的视图中。
一旦我在这个子类的每个对象上调用一个函数“反弹”。所有这些层(气球)的位置开始以这样的方式动画,它会在视图边界周围产生反弹效果。它不断改变层的位置,直到通过调用方法“stopBouncing”停止它。
现在的问题是,如果气球的数量很高,层中有一些闪烁,性能也不好。
如果有人可以帮助我有效地实施此类要求,我将不胜感激。
注意:这是针对 iPhone 的。
一段完整的代码:
-(void)bounce
self.position=CGPointMake(self.position.x+self.moveOffset.x,self.position.y+self.moveOffset.y);
if(self.position.x>self.maxBoundary.x || self.position.x<self.minBoundary.x)
self.moveOffset.x=-self.moveOffset.x;
if(self.position.y>self.maxBoundary.y || self.position.y<self.minBoundary.y)
self.moveOffset.y=-self.moveOffset.y;
这里,moveOffset 是一个时间间隔内层在 x 轴和 y 轴上移动的距离。
【问题讨论】:
使用组动画。看到这个帖子***.com/questions/10938223/… 感谢您的回复。据我了解,组动画用于在一个图层上应用多个动画。但我的要求是同时为多个图层设置动画,并且图层数取决于记录数(意味着它的变量)。动画种类是单一的,但它是无限的,它会不断移动图层的位置。 No No. 组动画可以同时播放多层动画,也可以连续播放。它基于动画开始和结束时间的计算。 是的,CAAnimationGroup 可以定时动画,也可以连续动画。但它不是多层的,请看***.com/questions/17764375/… 【参考方案1】:不要使用图层。
改用 Sprite Kit。
https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html
【讨论】:
这正是我想要的。非常感谢。 不用担心。需要明确的是,如果您没有很多图层同时移动,那么图层是正确的方法。 Sprite Kit 仅适用于层开始挣扎时。【参考方案2】:在这里,您希望将气球指定为图层,而不是实际为 UIImage 设置动画。这段代码有点老了,但在 Swift 3 中,您要确保编写这样的代码:
let balloonImage = CALayer()
balloonImage.contents = UIImage(named: "balloon")!.cgImage
balloonImage.frame = CGRect(x: -50.0, y: 0.0, width: 50.0, height: 65.0)
view.layer.insertSublayer(balloonImage, below: username.layer)
UIImage(named:"") 应该是您的图像的名称,框架是您希望作为 UIImage 副本的图层的大小。然后将视图插入到主视图中。 let flight 允许您对您创建的图层执行动画。您可以有不同的设置动画,例如 CABasicAnimation、CASpringAnimation 等,但请注意,因为不同的动画具有不同的设置默认值,因为您不能在 CABasicAnimation 中使用提供值/时间。 keyframeAnimation 只是使用动画的值。您还可以有不同的键路径,如“position.x”或“postion.y”。其他关键路径包括:transform.rotation、position.x、position.y。
let flight = CAKeyframeAnimation(keyPath: "position")
flight.duration = 30.0
flight.values = [
CGPoint(x: -50.0, y: 0.0),
CGPoint(x: view.frame.width + 50, y: 160.0),
CGPoint(x: -50.0, y: loginButton.center.y)
].map(
NSValue(cgPoint: $0)
)
flight.keyTimes = [0.0, 0.5, 1.0]
balloonImage.add(flight, forKey: nil)
balloonImage.position = CGPoint(x: -50.0, y: loginButton.center.y)
【讨论】:
以上是关于需要有关多层动画位置的帮助的主要内容,如果未能解决你的问题,请参考以下文章
需要有关 unix 脚本的帮助以从特定位置读取数据并使用在查询中提取的数据