ShapeLayer.strokeEnd Swift 没时间了
ShapeLayer.strokeEnd is filling up out of time in Swift
我创建了一个 CAShapeLayer
圆圈,并添加了一些动画以在图像加载时填充它,直到圆圈完全填满并显示图像。
我使用 Alamofire 的 .fractionCompleted
作为我的 shapeLayer.strokeEnd
属性 的值(它定义了圆填满的速度).但是它有一个奇怪的行为;它完全加载,然后倒退,然后完全填满,然后再次返回,依此类推。
这是一个说明情况的 GIF:Click to see
这是 API 调用:
class Service {
var delegate: ServiceDelegate?
let baseUrl = "https://picsum.photos/id/0/5616/3744"
typealias ImageCallback = (UIImage) -> Void
func fetchImage(handler: @escaping ImageCallback) {
AF.request(baseUrl).validate().downloadProgress { progress in
let percentage = CGFloat(progress.fractionCompleted)
self.delegate?.sendProgress(progress: percentage)
}.response { (response) in
do {
guard let data = response.data,
let image = UIImage(data: data)
else { return }
handler(image)
} catch {
print("DEBUG ERROR: \(error)")
}
}.resume()
}
}
这是在 VC 上实现的 ServiceDelegate 函数:
extension ViewController: ServiceDelegate {
func sendProgress(progress: CGFloat) {
DispatchQueue.main.async {
self.animateCircle(strokeEnd: progress)
}
print(progress)
}
}
基本动画代码:
func animateCircle(strokeEnd: CGFloat) {
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = 1
basicAnimation.duration = 2
basicAnimation.fillMode = .forwards
basicAnimation.isRemovedOnCompletion = false
shapeLayer.strokeEnd = strokeEnd
shapeLayer.add(basicAnimation, forKey: "randomKey")
}
如果您需要另一段代码,请告诉我。
没关系,我解决了。我的问题是我仍然在使用 animateCircle() 函数,即使 shapeLayer.strokeEnd 应该做完全相同的工作。当我评论这个功能时,它完美地工作了。
我创建了一个 CAShapeLayer
圆圈,并添加了一些动画以在图像加载时填充它,直到圆圈完全填满并显示图像。
我使用 Alamofire 的 .fractionCompleted
作为我的 shapeLayer.strokeEnd
属性 的值(它定义了圆填满的速度).但是它有一个奇怪的行为;它完全加载,然后倒退,然后完全填满,然后再次返回,依此类推。
这是一个说明情况的 GIF:Click to see
这是 API 调用:
class Service {
var delegate: ServiceDelegate?
let baseUrl = "https://picsum.photos/id/0/5616/3744"
typealias ImageCallback = (UIImage) -> Void
func fetchImage(handler: @escaping ImageCallback) {
AF.request(baseUrl).validate().downloadProgress { progress in
let percentage = CGFloat(progress.fractionCompleted)
self.delegate?.sendProgress(progress: percentage)
}.response { (response) in
do {
guard let data = response.data,
let image = UIImage(data: data)
else { return }
handler(image)
} catch {
print("DEBUG ERROR: \(error)")
}
}.resume()
}
}
这是在 VC 上实现的 ServiceDelegate 函数:
extension ViewController: ServiceDelegate {
func sendProgress(progress: CGFloat) {
DispatchQueue.main.async {
self.animateCircle(strokeEnd: progress)
}
print(progress)
}
}
基本动画代码:
func animateCircle(strokeEnd: CGFloat) {
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = 1
basicAnimation.duration = 2
basicAnimation.fillMode = .forwards
basicAnimation.isRemovedOnCompletion = false
shapeLayer.strokeEnd = strokeEnd
shapeLayer.add(basicAnimation, forKey: "randomKey")
}
如果您需要另一段代码,请告诉我。
没关系,我解决了。我的问题是我仍然在使用 animateCircle() 函数,即使 shapeLayer.strokeEnd 应该做完全相同的工作。当我评论这个功能时,它完美地工作了。