2017-04-26 65 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() 
}