动画旋转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()
这是旋转imageview的代码。 swift 3.0
UIView.animate(withDuration:2.0, animations: { self.dropDownImage.transform = CGAffineTransform(rotationAngle: CGFloat(imageRotation)) })
首先,如果要旋转180度,则必须转换为弧度。 弧度为180度是pi
。 360度将是2 * pi
。 180 * 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 }