我试图在iOS中为海军式雷达(下面的旋转部分)的标题线设置动画,如下所示:
我当前的缓慢,滞后和高开销的解决方案(伪代码因为真正的Swift代码有点冗长):
create NSTimer to call animate() every 1/60 sec
currentAngle = 0
animate():
create UIBezierPath from center of circle to outside edge at currentAngle
add path to new CAShapeLayer, add layer to views layer
add fade out CABasicAnimation to layer (reduces opacity over time)
increase currentAngle
在不使用.gif的情况下,最好的方法是什么?我已经实现了上面的解决方案,但性能(帧速率和CPU使用率)非常糟糕。你会如何处理这个问题?
答案 0 :(得分:2)
你的方法过于复杂。不要在动画期间尝试重新绘制图像。
将从淡入和淡出的部分旋转的部分分开,并分别为它们设置动画。使每个动画绘制部分透明,以便显示其他动画。
创建旋转零件的静态图像,或者构建一个创建该图像的图层。
如果您创建图像,则可以使用UIView动画为图像视图上的旋转设置动画。
如果您创建一个绘制标题线及其周围渐变的图层,请使用CABasicAnimation
动画图层转换的z旋转。
答案 1 :(得分:1)
感谢Animations in Swift / iOS 8文章:
,我来到了一个有效的Swift 3解决方案 let scanInProgress = UIImageView()
scanInProgress.image = UIImage(named: "scanInProgress.png")
scanInProgress.frame = CGRect(x: 150, y: 200, width: 80, height: 200)
view.addSubview(scanInProgress)
let fullRotation = CGFloat(Double.pi * 2)
let duration = 2.0
let delay = 0.0
UIView.animateKeyframes(withDuration: duration, delay: delay, options: [.repeat, .calculationModeLinear], animations: {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1/3, animations: {
scanInProgress.transform = CGAffineTransform(rotationAngle: 1/3 * fullRotation)
})
UIView.addKeyframe(withRelativeStartTime: 1/3, relativeDuration: 1/3, animations: {
scanInProgress.transform = CGAffineTransform(rotationAngle: 2/3 * fullRotation)
})
UIView.addKeyframe(withRelativeStartTime: 2/3, relativeDuration: 1/3, animations: {
scanInProgress.transform = CGAffineTransform(rotationAngle: 3/3 * fullRotation)
})
}, completion: {
})