在iOS开发中,UIView
的动画块是一种常用的方式来创建动画效果。如果你想要在 alpha
属性上平滑地暂停一个重复的动画,然后再播放另一个动画,你可以使用 UIView
的动画方法和 CADisplayLink
来实现。
UIView
提供了类方法来创建动画块,例如 animateWithDuration:animations:
。CADisplayLink
可以确保动画与屏幕刷新同步,从而实现更平滑的动画效果。repeatCount
属性为 INFINITY
来创建无限重复的动画。beginTime
属性来实现动画的暂停和恢复。以下是一个示例代码,展示了如何在 alpha
属性上平滑地暂停一个重复的动画,然后再播放另一个动画:
import UIKit
class AnimatedView: UIView {
private var displayLink: CADisplayLink?
private var startTime: CFTimeInterval = 0
private var pausedTimeOffset: CFTimeInterval = 0
private var animationDuration: TimeInterval = 2.0
override init(frame: CGRect) {
super.init(frame: frame)
setupAnimation()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupAnimation()
}
private func setupAnimation() {
displayLink = CADisplayLink(target: self, selector: #selector(updateAnimation))
displayLink?.add(to: .current, forMode: .common)
}
@objc private func updateAnimation(displayLink: CADisplayLink) {
if startTime == 0 {
startTime = displayLink.timestamp - pausedTimeOffset
}
let elapsed = displayLink.timestamp - startTime
let progress = CGFloat(fmod(elapsed, animationDuration) / animationDuration)
alpha = 0.5 + 0.5 * sin(progress * .pi * 2)
}
func pauseAnimation() {
if !displayLink?.isPaused ?? true {
displayLink?.pause()
pausedTimeOffset = CACurrentMediaTime() - startTime
}
}
func resumeAnimation() {
if displayLink?.isPaused ?? false {
startTime = CACurrentMediaTime() - pausedTimeOffset
displayLink?.resume()
}
}
func startNewAnimation() {
pauseAnimation()
// 设置新的动画参数
animationDuration = 3.0
startTime = 0
displayLink?.resume()
}
}
如果你遇到了动画不平滑或者无法正确暂停和恢复的问题,可能的原因包括:
CACurrentMediaTime()
来获取当前时间,这是一个与显示器刷新率同步的时间。animationDuration
和 startTime
的设置是否正确。CADisplayLink
正确地添加到了当前的运行循环中,并且正确处理了暂停和恢复的状态。解决方法:
CACurrentMediaTime()
的。startTime
以确保动画从正确的点开始。CADisplayLink
的状态与动画的播放状态一致。通过上述方法,你应该能够在 alpha
属性上实现平滑的重复动画的暂停和另一个动画的播放。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云