анимация вращения 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

    }