2017-04-26 30 views
0

我正在一個視圖中繪製一個加載圓。如果我直接用Is初始視圖控制器打開視圖。圓圈是動畫,但如果我選擇從前一個視圖(tableview)打開它。它來與平局但不動畫。我試圖在viewdidload中調用setup(),didawake函數,但仍然沒有機會。它不工作。圓形動畫不起作用

class SpinningView: UIView { 

    let circleLayer = CAShapeLayer() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     setup() 
    } 
    @IBInspectable var lineWidth: CGFloat = 4 { 
     didSet { 
      circleLayer.lineWidth = lineWidth 
      setNeedsLayout() 
     } 
    } 

    func setup() { 
     circleLayer.lineWidth = lineWidth 
     circleLayer.lineWidth = 10 
     circleLayer.fillColor = nil 
     circleLayer.strokeColor = UIColor(red: 0.8078, green: 0.2549, blue: 0.2392, alpha: 1.0).cgColor 
     layer.addSublayer(circleLayer) 
     tintColorDidChange() 
     updateAnimation() 
    } 
    func updateAnimation() { 
     if animating { 
      circleLayer.add(strokeEndAnimation, forKey: "strokeEnd") 
      circleLayer.add(strokeStartAnimation, forKey: "strokeStart") 
     } 
     else { 
      circleLayer.removeAnimation(forKey: "strokeEnd") 
      circleLayer.removeAnimation(forKey: "strokeStart") 
     } 
    } 
    override func layoutSubviews() { 
     super.layoutSubviews() 

     let center = CGPoint(x: bounds.midX, y: bounds.midY) 
     let radius = min(bounds.width, bounds.height)/2 - circleLayer.lineWidth/2 

     let startAngle = CGFloat(-M_PI_2) 
     let endAngle = startAngle + CGFloat(M_PI * 2) 
     let path = UIBezierPath(arcCenter: CGPoint.zero, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) 

     circleLayer.position = center 
     circleLayer.path = path.cgPath 
    } 
    override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     setup() 
    } 
    override func tintColorDidChange() { 
     super.tintColorDidChange() 
     circleLayer.strokeColor = tintColor.cgColor 
    } 
    @IBInspectable var animating: Bool = true { 
     didSet { 
      updateAnimation() 
     } 
    } 

    let strokeEndAnimation: CAAnimation = { 
     let animation = CABasicAnimation(keyPath: "strokeEnd") 
     animation.fromValue = 0 
     animation.toValue = 1 
     animation.duration = 2 
     animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 

     let group = CAAnimationGroup() 
     group.duration = 2.5 
     group.repeatCount = MAXFLOAT 
     group.animations = [animation] 

     return group 
    }() 

    let strokeStartAnimation: CAAnimation = { 
     let animation = CABasicAnimation(keyPath: "strokeStart") 
     animation.beginTime = 0.5 
     animation.fromValue = 0 
     animation.toValue = 1 
     animation.duration = 2 
     animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 

     let group = CAAnimationGroup() 
     group.duration = 2.5 
     group.repeatCount = MAXFLOAT 
     group.animations = [animation] 

     return group 
    }() 


} 

回答

0

我通過調用viewdidappear中的awakefromNib()函數解決了這個問題。所以我的代碼創建了一個圓圈,它可以像Google一樣的圓圈動畫。

override func viewDidAppear(_ animated: Bool) { 
    mSpinningView.awakeFromNib() 
}