Как мне продолжать вращать изображение, пока не будет получен ответ от сервера в быстрой - PullRequest
0 голосов
/ 15 октября 2018

Я делаю асинхронный вызов при каждом нажатии кнопки. Теперь я хочу, чтобы изображение, похожее на значок обновления, вращалось или вращалось до тех пор, пока не получу ответ от своего сервера.То, что у меня сейчас есть, поворачивает только пи на 180, и когда приходит ответ, изображение не сбрасывается.Вставили мой пример кода ниже:

//When the update button is clicked
@objc func updateHome(){
    UIView.animate(withDuration: 1) {
        self.updateIcon.transform = CGAffineTransform(rotationAngle: .pi)
    }
    getBalances()
}
//Inside getBalances function
DispatchQueue.main.async {
                        if responseCode == 0 {
                            let today = self.getTodayString()
                            print("Time: \(today)")
                            UIView.animate(withDuration: 1) {
                                self.updateIcon.transform = CGAffineTransform(rotationAngle: .pi)
                            }
}

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Для непрерывного вращения вы можете использовать CAKeyframeAnimation , как показано ниже.

@objc func updateHome() { 
        let animation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        animation.duration = 1.0
        animation.fillMode = kCAFillModeForwards
        animation.repeatCount = .infinity
        animation.values = [0, Double.pi/2, Double.pi, Double.pi*3/2, Double.pi*2]
        let moments = [NSNumber(value: 0.0), NSNumber(value: 0.1),
                       NSNumber(value: 0.3), NSNumber(value: 0.8), NSNumber(value: 1.0)]
        animation.keyTimes = moments
        self.updateIcon.layer.add(animation, forKey: "rotate")
        getBalances()
    }

В вашем асинхронном методе (внутри) DispatchQueue.main.async вы можете остановиться, как показано ниже.Это сохранит вас в исходном положении изображения.

self.updateIcon.layer.removeAllAnimations()
0 голосов
/ 15 октября 2018

Один из способов справиться с этим - добавить переменную экземпляра, которая отслеживает, когда работа завершена:

var finished: Bool = false

Затем напишите функцию, которая поворачивает изображение и использует обработчик завершения, чтобы вызвать себя для продолжения.вращение:

func rotateImage() {
    UIView.animate(withDuration: 1, 
    delay: 0.0,
    options: .curveLinear
    animations: {
        self.updateIcon.transform = CGAffineTransform(rotationAngle: .pi)
        },
    completion: { completed in
        if !self.finished {
          self.rotateImage()
        }
    }
    }
}

Если вы хотите немедленно остановить анимацию, вы должны установить finished = true и вызвать updateIcon.layer.removeAllAnimations()

0 голосов
/ 15 октября 2018

Этот код вращает ваш UIImageView бесконечно, используя CABasicAnimation:

let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.fromValue = 0.0
rotateAnimation.toValue = CGFloat(.pi * 2.0)
rotateAnimation.duration = 1.0  // Change this to change how many seconds a rotation takes
rotateAnimation.repeatCount = Float.greatestFiniteMagnitude

updateIcon.layer.add(rotateAnimation, forKey: "rotate")

И когда вы получаете сигнал с вашего сервера, вы можете позвонить

updateIcon.layer.removeAnimation(forKey: "rotate")

, чтобы остановить анимацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...