2017-01-29 17 views
0

プロジェクトに円アニメーションを追加したいと思います。私はvery good help hereを見つけました。IBActionで機能し、SwiftのviewDidLoadで機能しない関数

このコードはメインページのviewDidLoadで動作しますが、別のページでは動作しません。 しかし、私が望むページにテストボタンを置くと動作します。私がviewDidLoadで関数を呼び出すと、10秒か60秒かかっても、アニメーションはすでに終了しています。

このコードされています

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: 0.0, endAngle: CGFloat(M_PI * 2.0), clockwise: true) 
 
     
 
     // Setup the CAShapeLayer with the path, colors, and line width 
 
     circleLayer = CAShapeLayer() 
 
     circleLayer.path = circlePath.cgPath 
 
     circleLayer.fillColor = UIColor.clear.cgColor 
 
     circleLayer.strokeColor = UIColor.white.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") 
 
    } 
 
    
 
}

と私の見解について:

func addCircleView() { 
 
     let diceRoll = CGFloat(100) 
 
     let circleWidth = CGFloat(200) 
 
     let circleHeight = circleWidth 
 
     
 
     // Create a new CircleView 
 
     let circleView = CircleView(frame: CGRect(diceRoll, 0, circleWidth, circleHeight)) 
 
     
 
     view.addSubview(circleView) 
 
     
 
     // Animate the drawing of the circle over the course of 1 second 
 
     circleView.animateCircle(TimeInterval(seconds)) 
 
    }

(秒はインスタンス変数であると私はめざしビューが開いているときにuldがaddCircleViewを呼び出すようにします)。

+0

viewDidLoadではなくviewDidAppearを試しましたか? – Marcelo

答えて

0

UIViewControllerのインスタンス化時にviewDidLoadが呼び出されます。 viewDidAppearは、UIViewControllerが表示されたときに呼び出されます。アニメーションをviewDidAppearに移動する必要があります

関連する問題