gpt4 book ai didi

swift - 在 Swift 3 中进入背景后,viewDidAppear 中的动画无法正常工作

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:46 24 4
gpt4 key购买 nike

我目前正在使用 Swift 3 开发一个倒计时应用程序。在柜台后面,我创建了一个圆圈,该圆圈根据计数器进行动画处理。

我的问题很简单:当我点击主页并将应用程序置于后台时,当我返回应用程序时动画不再工作。我不知道为什么。有趣的事实:“绘图”是一个普通的圆圈,只有边框是动画的。圆圈的背景还可以,只是边框动画不再起作用了。

这是我的代码:

 override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let screen = self.view.frame.size.width
let y = CGFloat(190)
let circleWidth = CGFloat(200)
let circleHeight = circleWidth

// Create a new CircleView
let circleView = CircleView(frame: CGRect(x: (screen/2) - (circleWidth/2), y: y, width: circleWidth, height: circleHeight))

view.addSubview(circleView)

// Animate the drawing of the circle over the course of 1 second
circleView.animateCircle(TimeInterval(seconds))
}

CircleView类:

import Foundation
import UIKit

class CircleView: UIView{
var circleLayer: CAShapeLayer!

override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.clear

// Use UIBezierPath as an easy way to create the CGPath for the layer.
// The path should be the entire circle.
let circlePath = UIBezierPath(arcCenter: CGPoint(x: frame.size.width / 2.0, y: frame.size.height / 2.0), radius: (frame.size.width - 10)/2, startAngle: CGFloat(-M_PI/2), endAngle: CGFloat(M_PI*1.5), clockwise: true)

// Setup the CAShapeLayer with the path, colors, and line width
circleLayer = CAShapeLayer()
circleLayer.path = circlePath.cgPath
circleLayer.fillColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 0.2).cgColor
circleLayer.strokeColor = UIColor(red: 165/255, green: 219/255, blue: 255/255, alpha: 0.8).cgColor
circleLayer.lineWidth = 2.0;

// Don't draw the circle initially
circleLayer.strokeEnd = 0.0

// Add the circleLayer to the view's layer's sublayers
layer.addSublayer(circleLayer)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}


func animateCircle(_ duration: TimeInterval) {
// We want to animate the strokeEnd property of the circleLayer
let animation = CABasicAnimation(keyPath: "strokeEnd")

// Set the animation duration appropriately
animation.duration = duration

// Animate from 0 (no circle) to 1 (full circle)
animation.fromValue = 1
animation.toValue = 0

// Do a linear animation (i.e. the speed of the animation stays the same)
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)

// Set the circleLayer's strokeEnd property to 1.0 now so that it's the
// right value when the animation ends.
circleLayer.strokeEnd = 0.0

// Do the actual animation
circleLayer.add(animation, forKey: "animateCircle")
}

}

最佳答案

您需要做的就是在动画代码中再添加一行:

animation.isRemovedOnCompletion = false

您的代码将是:

func animateCircle(_ duration: TimeInterval) {
// We want to animate the strokeEnd property of the circleLayer
let animation = CABasicAnimation(keyPath: "strokeEnd")

// Set the animation duration appropriately
animation.duration = duration

// Animate from 0 (no circle) to 1 (full circle)
animation.fromValue = 1
animation.toValue = 0

// Do a linear animation (i.e. the speed of the animation stays the same)
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)

animation.isRemovedOnCompletion = false

// Set the circleLayer's strokeEnd property to 1.0 now so that it's the
// right value when the animation ends.
circleLayer.strokeEnd = 0.0

// Do the actual animation
circleLayer.add(animation, forKey: "animateCircle")
}

关于swift - 在 Swift 3 中进入背景后,viewDidAppear 中的动画无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42070823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com