SwiftでiOSアプリのインターバルタイマーアプリを開発しています。
一時停止をした時に、タイマーの数字は止めれるのですが、
円のアニメーションが止まりません。
どのように実装したらよろしいでしょうか?
stop()の部分でタイマーとアニメーションを止めたいと思っています。
ご教授いただけると幸いです。
よろしくお願いいたします。
swift
1 2import UIKit 3 4@objc protocol CountDownDelegate { 5 func didCount(count:Int) 6 func didFinish() 7} 8 9 10class CountDownView: UIView, CAAnimationDelegate { 11 12 weak var delegate: CountDownDelegate? 13 14 var shapeLayer = CAShapeLayer() 15 var label = UILabel() 16 var max = 0 17 var timer: Timer? 18 19 20 override init(frame: CGRect) { 21 super.init(frame: frame) 22 } 23 24 required init?(coder aDecoder: NSCoder) { 25 fatalError("init(coder:) has not been implemented") 26 } 27 28 override func layoutSubviews() { 29 print("DEBUG_PRINT: layoutSubviewsが呼ばれました") 30 let lineWidth:CGFloat = 10.0 31 //let lineColor = UIColor.black 32 33 shapeLayer.isHidden = true 34 label.isHidden = true 35 shapeLayer.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height) 36 shapeLayer.fillColor = UIColor.clear.cgColor 37 shapeLayer.strokeColor = UIColor.black.cgColor 38 shapeLayer.lineWidth = lineWidth 39 40 let center = CGPoint(x: bounds.size.width / 2.0, y: bounds.size.height / 2.0) 41 let radius = bounds.size.width 42 let startAngle = CGFloat(-M_PI_2) 43 let endAngle = startAngle + 2.0 * CGFloat(M_PI) 44 let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) 45 shapeLayer.path = path.cgPath 46 layer.addSublayer(shapeLayer) 47 48 label.frame = CGRect(x: 0, y: 0, width: frame.width * 2, height: frame.height * 2) 49 label.center = CGPoint(x: bounds.size.width / 2.0, y: bounds.size.height / 2.0) 50 label.textAlignment = NSTextAlignment.center 51 // 文字のガタつきを解消 52 label.font = UIFont.monospacedDigitSystemFont(ofSize: 50, weight: .heavy) 53 //label.font = UIFont.init(name: "DBLCDTempBlack", size: 50) 54 addSubview(label) 55 } 56 57 func start(max:Int, timeColor: String) { 58 print("DEBUG_PRINT: start (max)") 59 if self.timer == nil { 60 self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(count(_:)), userInfo: nil, repeats: true) 61 } 62 animation(max) 63 self.max = max 64 label.text = "(max)" 65 shapeLayer.isHidden = false 66 label.isHidden = false 67 68 switch timeColor { 69 case "jyunbi": 70 shapeLayer.strokeColor = UIColor.systemYellow.cgColor 71 label.textColor = UIColor.systemYellow 72 case "undou": 73 shapeLayer.strokeColor = UIColor.systemRed.cgColor 74 label.textColor = UIColor.systemRed 75 case "kyukei": 76 shapeLayer.strokeColor = UIColor.systemBlue.cgColor 77 label.textColor = UIColor.systemBlue 78 default: 79 shapeLayer.strokeColor = UIColor.black.cgColor 80 label.textColor = UIColor.blue 81 } 82 83 } 84 85 @objc func count(_ timer: Timer) { 86 print("DEBUG_PRINT: countが始まりました") 87 print(max) 88 if self.max != 0 { 89 print("DEBUG_PRINT: (max)") 90 self.max -= 1 91 label.text = "(max)" 92 } else if max == 0 { 93 print("aaa") 94 if self.timer != nil { 95 self.timer?.invalidate() 96 self.timer = nil 97 } 98 } 99 100 101 } 102 103 func animation(_ max: Int) { 104 print("animationが呼ばれました") 105 let animation = CABasicAnimation(keyPath: "strokeEnd") 106 animation.duration = CFTimeInterval(max) 107 animation.fromValue = 1.0 108 animation.toValue = 0.0 109 animation.delegate = self 110 shapeLayer.add(animation, forKey: "circleAnim") 111 } 112 113 114 // タイマーとアニメーションを止める 115 func stop() { 116 print("DEBUG_PRINT: stopが呼ばれました") 117 if self.timer != nil { 118 self.timer?.invalidate() 119 self.timer = nil 120 121 } 122 } 123 124 125 func reset() { 126 shapeLayer.isHidden = true 127 shapeLayer.removeAnimation(forKey: "circleAnim") 128 } 129 130 func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 131 print("DEBUG_PRINT: animationDidStopが呼ばれました") 132 delegate?.didFinish() 133 134 } 135} 136
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/10 11:48
2020/08/10 11:50
2020/08/11 03:09
2020/08/11 12:53