2017-01-29 46 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)) 
 
    }

(秒是一個實例變量和我を當視圖打開時,它喜歡調用addCircleView)。

+0

您是否嘗試使用viewDidAppear而不是viewDidLoad? – Marcelo

回答

0

viewDidLoad在實例化UIViewController時被調用。在呈現UIViewController時調用viewDidAppear。您需要將動畫移動到viewDidAppear

相關問題