原因是当prepareForReuse 工作或您的应用程序进入后台模式时,rotation.z 键的动画变为 nil 。
考虑手动绘制活动指示器或尝试类似 https://github.com/airbnb/lottie-ios
活动指示器下方的方法可以在滚动/单元格/背景模式下正常滚动
我尝试了 rotation.z 和一些基于 CAReplicationLayer 的变通方法——在滚动/单元格/背景模式下都失败了

private func drawLoaderCircle() {
let path = UIBezierPath(arcCenter: loaderViewCenter, radius: loaderCircleRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true).cgPath
setupGrapes(endAngle: 310, path: path)
}
private func setupGrapes(endAngle: CGFloat, path: CGPath) {
let step: CGFloat = 2
var grapeAnimationDelay: CFTimeInterval = 0
for i in stride(from: 0, to: endAngle, by: step) {
let radians = i * .pi / 180
let x = loaderViewCenter.x + loaderCircleRadius * cos(radians)
let y = loaderViewCenter.y + loaderCircleRadius * sin(radians)
let grapeLayer = CAShapeLayer()
grapeLayer.frame = CGRect(x: 0, y: 0, width: circleWidth + 0.2, height: circleWidth + 0.2)
grapeLayer.position = CGPoint(x: x, y: y)
grapeLayer.cornerRadius = grapeLayer.frame.width / 2
grapeLayer.backgroundColor = loaderColor.cgColor
grapeAnimationDelay += Double(rotateDuration * Double(step) / 360)
let rotateGrapeAnimation = CAKeyframeAnimation(keyPath: "position")
rotateGrapeAnimation.path = path
rotateGrapeAnimation.beginTime = grapeAnimationDelay
rotateGrapeAnimation.calculationMode = .linear
rotateGrapeAnimation.repeatCount = .infinity
rotateGrapeAnimation.isRemovedOnCompletion = false
rotateGrapeAnimation.duration = rotateDuration
grapeLayer.add(rotateGrapeAnimation, forKey: nil)
progressLayer.addSublayer(grapeLayer)
}
}