2017-04-26 5 views
0

ビュー内にローディングサークルを描画しています。私がビューを直接開いているのは、最初のView Controllerです。サークルはアニメーション化されていますが、前のビュー(テーブルビュー)から開くことを選択した場合。ドローが付いていますがアニメーション化されていません。私はsetupd()を呼び出そうとしましたが、viewdidloadの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

awakefromNib()関数をviewdidappearで呼び出すことで問題を解決しました。そこで、私のコードでは、グーグルサークルのようにアニメーション化されたサークルが作成されます。

override func viewDidAppear(_ animated: Bool) { 
    mSpinningView.awakeFromNib() 
} 
関連する問題