2016-04-17 13 views
0

私はこのライブラリをobjcからSwiftに移植しています。なぜ、レプリケータレイヤinstanceCountがアニメーションに対して何もしていないのを見つけるのに問題があります。何かご意見は?SwiftのCoreAnimationとCAReplicatorLayer?

ライブラリーを見ると、レイヤーの複数のインスタンスが同時にアニメーション化されますが、コードでは一度に1つのレイヤーだけがアニメーション化されます。

https://github.com/shu223/PulsingHalo/blob/master/PulsingHalo/PulsingHaloLayer.m

public class PulsingHaloLayer2: CAReplicatorLayer { 

    var fromValueForRadius: Float = 0.0 
    var fromValueForAlpha: Float = 0.45 
    var keyTimeForHalfOpacity: Float = 0.2 
    var animationDuration: NSTimeInterval = 3.0 
    var pulseInterval: NSTimeInterval = 0.0 
    var useTimingFunction: Bool = true 
    let animationGroup: CAAnimationGroup = CAAnimationGroup() 
    var repetitions: Float = Float.infinity 
    var radius: CGFloat = 200.0 { 
     didSet { 
      let tempPos = position 
      let diameter = radius * 2 

      bounds = CGRect(x: 0.0, y: 0.0, width: diameter, height: diameter) 
      cornerRadius = radius 
      position = tempPos 
     } 
    } 
    var haloLayerNumber: Int = 4 { 
     didSet { 
      instanceCount = 4 
      instanceDelay = (animationDuration + pulseInterval)/Double(haloLayerNumber) 
     } 
    } 

    override init() { 
     super.init() 
     contentsScale = UIScreen.mainScreen().scale 
     opacity = 0.0 
     backgroundColor = UIColor.blueColor().CGColor 
     haloLayerNumber = 4 

     setupAnimationGroup() 
     addAnimation(animationGroup, forKey: "pulse") 
    } 

    required public init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func setupAnimationGroup() { 
     animationGroup.duration = animationDuration + pulseInterval 
     animationGroup.repeatCount = repetitions 
     animationGroup.removedOnCompletion = false 

     if useTimingFunction { 
      let defaultCurve = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 
      animationGroup.timingFunction = defaultCurve 
     } 

     let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity") 
     opacityAnimation.duration = animationDuration 
     opacityAnimation.values = [fromValueForAlpha, 0.45, 0] 
     opacityAnimation.keyTimes = [0, keyTimeForHalfOpacity, 1] 

     let scaleAnimation = CABasicAnimation(keyPath: "transform.scale.xy") 
     scaleAnimation.fromValue = fromValueForRadius 
     scaleAnimation.toValue = 1 
     scaleAnimation.duration = animationDuration 

     animationGroup.animations = [opacityAnimation, scaleAnimation] 
    } 

} 

答えて

3

あなたがhaloLayerNumber = 4を呼び出すと、それはinitの内部で起こっているので、これはdidSetブロックをトリガしません。

クロージャを使用して回避することができます:({ haloLayerNumber = 4 })()。またはinstanceCount/instanceDelayinitから手動で更新することもできます。

関連する問題