       morphX.values = [1, 1.3 * self.force, 0.7, 1.3 * self.force, 1]
       morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
       morphX.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
-      morphX.duration = CFTimeInterval(self.duration)
-      morphX.repeatCount = self.repeatCount
-      morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
-      
+     
       let morphY = CAKeyframeAnimation(keyPath: "transform.scale.y")
       morphY.values = [1, 0.7, 1.3 * self.force, 0.7, 1]
       morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
       morphY.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
-      morphY.duration = CFTimeInterval(self.duration)
-      morphY.repeatCount = self.repeatCount
-      morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
       
-      self.layer.addAnimation(morphX, forKey: "morphX")
-      self.layer.addAnimation(morphY, forKey: "morphY")
+      let animationGroup = CAAnimationGroup()
+      animationGroup.animations = [morphX, morphY]
+      animationGroup.duration = CFTimeInterval(self.duration)
+      animationGroup.repeatCount = self.repeatCount
+      animationGroup.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
+      self.layer.addAnimation(animationGroup, forKey: "morph")
       }, completion: completion)
   }
 

      squeezeX.values = [1, 1.5 * self.force, 0.5, 1.5 * self.force, 1]
      squeezeX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
      squeezeX.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
      squeezeX.duration = CFTimeInterval(self.duration)
      squeezeX.repeatCount = self.repeatCount
      squeezeX.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
      
      let squeezeY = CAKeyframeAnimation(keyPath: "transform.scale.y")
      squeezeY.values = [1, 0.5, 1, 0.5, 1]
      squeezeY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
      squeezeY.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
      squeezeY.duration = CFTimeInterval(self.duration)
      squeezeY.repeatCount = self.repeatCount
      squeezeY.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
      
      self.layer.addAnimation(squeezeX, forKey: "squeezeX")
      self.layer.addAnimation(squeezeY, forKey: "squeezeY")
      }, completion: completion)
  }
  

      let rotation = CAKeyframeAnimation(keyPath: "transform.rotation")
      rotation.values = [0, 0.3 * self.force, -0.3 * self.force, 0.3 * self.force, 0]
      rotation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
      rotation.additive = true
      
      let positionX = CAKeyframeAnimation(keyPath: "position.x")
      positionX.values = [0, 30 * self.force, -30 * self.force, 30 * self.force, 0]
      positionX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]
      positionX.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
      positionX.additive = true
      positionX.repeatCount = self.repeatCount
      
      let animationGroup = CAAnimationGroup()
      animationGroup.animations = [rotation, positionX]
      animationGroup.duration = CFTimeInterval(self.duration)
      animationGroup.beginTime = CACurrentMediaTime() + CFTimeInterval(self.delay)
      self.layer.addAnimation(animationGroup, forKey: "wobble")
      }, completion: completion)
  }
  
