Search code examples
iosobjective-cswiftshadowcakeyframeanimation

CAKeyframeAnimation rotation don't draw real shadow


I want to rotate an UIImageView with CAKeyframeAnimation. The problem is that the shadow rotates with the object, making a non-real effect... The shadow must remain under the image, not rotating around it

This is my code. Very simple:

    let imagen:UIImageView = UIImageView(image:UIImage(named: "material6.png"))

    self.view.addSubview(imagen)

    imagen.center = CGPoint(x: 100, y: 100)

    imagen.layer.shadowOpacity = 0.75
    imagen.layer.shadowOffset = CGSize(width: 0, height: 15)

    //Animación del ángulo
    let animacionAngulo = CAKeyframeAnimation(keyPath: "transform.rotation.z")

    var valoresAngulo = [NSNumber]()
    let degrees:Float = 360
    let radians = degrees * Float.pi / Float(180.0)

    valoresAngulo.append(NSNumber(value: 0))
    valoresAngulo.append(NSNumber(value: radians))

    animacionAngulo.values = valoresAngulo

    //Permite añadir varias animaciones y gestionarlas a la vez
    animacionAngulo.repeatCount = Float.infinity
    animacionAngulo.duration = 2.0

    imagen.layer.add(animacionAngulo, forKey: nil)

Any solution?


Solution

  • If the shadow is rotating along with the image. You can solve it by adding an UIView with same dimensions of your UIImageView below your UIImageView. If you add shadow to your UIView instead of UIImageView, you can achieve the desired effect in this case.

    let imagen:UIImageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    imagen.center = CGPoint(x: 100, y: 100)
    imagen.backgroundColor = UIColor.red
    
    let belowView: UIView = UIView(frame: imagen.frame)
    belowView.backgroundColor = UIColor.white
    belowView.layer.shadowOpacity = 0.75
    belowView.layer.shadowOffset = CGSize(width: 0, height: 15)
    self.view.addSubview(belowView)
    
    self.view.addSubview(imagen)
    
        //Animación del ángulo
    let animacionAngulo = CAKeyframeAnimation(keyPath: "transform.rotation.z")
    
    var valoresAngulo = [NSNumber]()
    let degrees:Float = 360
    let radians = degrees * Float.pi / Float(180.0)
    
    valoresAngulo.append(NSNumber(value: 0))
    valoresAngulo.append(NSNumber(value: radians))
    
    animacionAngulo.values = valoresAngulo
    
        //Permite añadir varias animaciones y gestionarlas a la vez
    animacionAngulo.repeatCount = Float.infinity
    animacionAngulo.duration = 2.0
    
    imagen.layer.add(animacionAngulo, forKey: nil)