анимация вращения UIImageView в быстрой
Я пытаюсь оживить поворот на 180 градусов UIImageView
в Swift
UIView.animateWithDuration(1.0, animations: { () -> Void in
self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI))
}) { (succeed) -> Void in
}
Но не анимация вообще. Я хочу использовать animateWithDuration, потому что я хочу вернуть его в какой-то момент, используя CGAffineTransformMakeIdentity
UIView
анимация 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()
Ответы
Ответ 1
Прежде всего, если вы хотите повернуть на 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)
Ответ 2
Вот код для поворота изображения. swift 3.0
UIView.animate(withDuration:2.0, animations: {
self.dropDownImage.transform = CGAffineTransform(rotationAngle: CGFloat(imageRotation))
})
Ответ 3
Обновлена версия 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")
Ответ 4
======= Расширение для UIView =======
Я нашел этот ответ из Интернета, и я тестирую его, прекрасно работает. Надеюсь, что это кому-нибудь поможет, просто измените UIView на ваши потребности, такие как, UIView, UIButton, UIImageView и т.д. И получите доступ с помощью функции myUIView.rotate()
, здесь myUIView следует заменить именем вашего представления (IBOutlet → имя) с правильным типом представления для расширения. По этой ссылке я нашел этот ответ. И этот метод прост и работает!
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")
}
}
Ответ 5
Вы CGFloat(180 * M_PI)
/180
на CGFloat(180 * M_PI)
. Пытаться:
UIView.animate(withDuration: 1.0) {[weak self] in
self?.arrowImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
})
Ответ 6
Убедитесь, что в главной теме
DispatchQueue.main.async {
UIView.animateWithDuration(1.0, animations: { () -> Void in
self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI))
}) { (succeed) -> Void in
}
}
Ответ 7
Для меня лучшее и кратчайшее решение (Swift 3/4):
self.YourImageView.transform = showing ? CGAffineTransform(rotationAngle: CGFloat.pi) : CGAffineTransform.identity
"показывая" это значение для определения - вращение изображения до или без - вы можете использовать свою собственную логику здесь
Ответ 8
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)
}
}
Ответ 9
Swift 5.0
extension UIImageView{
func rotate() {
let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotation.toValue = NSNumber(value: Double.pi * 2)
rotation.duration = 2
rotation.isCumulative = true
rotation.repeatCount = Float.greatestFiniteMagnitude
self.layer.add(rotation, forKey: "rotationAnimation")
}
}
Обновление @Rakshitha Muranga Родриго ответ.
Ответ 10
Попробуйте вызвать arrowImageView.layoutSubviews(), см. Ниже:
UIView.animateWithDuration(1.0, animations: { () -> Void in
self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(180 * M_PI))
self.arrowImageView.layoutSubviews()
}) { (succeed) -> Void in
}