动画旋转UIImageView在swift中

我试图在Swift中为UIImageView的180度旋转设置动画

  UIView.animateWithDuration(1.0, animations: { () -> Void in self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI)) }) { (succeed) -> Void in } 

但根本不是动画。 我想使用animateWithDuration,因为我想使用CGAffineTransformMakeIdentity在某些时候恢复它

使用UIView动画有效。

  UIView.beginAnimations(nil, context: nil) UIView.setAnimationDuration(1) UIView.setAnimationCurve(UIViewAnimationCurve.EaseIn) let radians = CGFloat(180 * M_PI / 180) arrowImageView.transform = CGAffineTransformMakeRotation(radians) UIView.commitAnimations() 

这是旋转im​​ageview的代码。 swift 3.0

 UIView.animate(withDuration:2.0, animations: { self.dropDownImage.transform = CGAffineTransform(rotationAngle: CGFloat(imageRotation)) }) 

首先,如果要旋转180度,则必须转换为弧度。 弧度为180度是pi 。 360度将是2 * pi180 * pi会使你的动画在一秒钟内旋转90次,最终以原始方向旋转。

其次,我不确定为什么你的代码不起作用,但我知道下面的代码确实有效:

 let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") rotationAnimation.fromValue = 0.0 rotationAnimation.toValue = M_PI rotationAnimation.duration = 1.0 self.arrowImageView.layer.addAnimation(rotationAnimation, forKey: nil) 

一定要在主线程中

 DispatchQueue.main.async { UIView.animateWithDuration(1.0, animations: { () -> Void in self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI)) }) { (succeed) -> Void in } } 

======= UIView的扩展 =======

我从互联网上找到了这个答案,我测试了它,工作得非常好。 希望这对任何人都有帮助,只需将UIView更改为你的需要,如UIView,UIButton,UIImageView等,并使用myUIView.rotate()函数进行访问,这里myUIView应该用你的View名称 替换 (IBOutlet – > name)具有正确的扩展视图类型。 这是我找到这个答案的链接 。 这种方法很有效率!

 extension UIView{ func rotate() { let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.toValue = NSNumber(double: M_PI * 2) rotation.duration = 1 rotation.cumulative = true rotation.repeatCount = FLT_MAX self.layer.addAnimation(rotation, forKey: "rotationAnimation") } } 

更新了swift 4.0版本:

  let rotation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.toValue = Double.pi * 2 rotation.duration = 0.25 // or however long you want ... rotation.isCumulative = true rotation.repeatCount = Float.greatestFiniteMagnitude yourView.layer.add(rotation, forKey: "rotationAnimation") 

你在CGFloat(180 * M_PI)上省略了/ 180 。 尝试:

 UIView.animate(withDuration: 1.0) {[weak self] in self?.arrowImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) }) 
 var shouldRotateArrow = false { didSet { rotateArrow() } } private func rotateArrow() { let angle: CGFloat = shouldRotateArrow ? .pi / 2 : 0 UIView.animate(withDuration: Constants.arrowRotationDuration) { self.arrowImageView.transform = CGAffineTransform(rotationAngle: angle) } } 

对我来说,最好和最短的解决方案是(Swift 3/4):

 self.YourImageView.transform = showing ? CGAffineTransform(rotationAngle: CGFloat.pi) : CGAffineTransform.identity 

“显示”它是一个值,以确定是否旋转图像 – 您可以在这里使用自己的逻辑

尝试调用arrowImageView.layoutSubviews(),见下文:

  UIView.animateWithDuration(1.0, animations: { () -> Void in self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI)) self.arrowImageView.layoutSubviews() }) { (succeed) -> Void in }