Прервать переход UIView - PullRequest
       58

Прервать переход UIView

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

Есть ли возможность прервать UIView.transition в его текущем состоянии на iOS?

Чтобы дать вам немного контекста: у меня есть UIButton, где мне нужно анимировать цвет заголовка - однако анимация может иметь различные задержки, связанные с ним.Поскольку UIView.transition не поддерживает задержки, я просто отложил выполнение всего блока:

DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
    UIView.transition(with: button, duration: 0.4, options: [.beginFromCurrentState, .allowUserInteraction, .transitionCrossDissolve], animations: {
        button.setTitleColor(selected ? .red : .black, for: .normal)
    }, completion: nil)
}

Проблема здесь в том, что, если этот код выполняется в быстрой последовательности с различными задержками, результат может быть неожиданным,Так, например, это может быть вызвано с selected=true, delay=0.5 и сразу после этого с selected=false, delay=0.0.В этом случае кнопка в конечном итоге станет красной, даже если она должна быть черной.

Поэтому я ищу метод, который либо имеет UIView.transform с задержкой, либо прерывает UIView.transform, либо создает setTitleColor() анимация через UIView.animate.

1 Ответ

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

Я на самом деле создал фреймворк, чтобы сделать это специально, вы можете запускать анимации относительно хода времени или значения интерполяции прогресса. Фреймворк и документацию можно найти здесь:

https://github.com/AntonTheDev/FlightAnimator

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

class CircleProgressView: UIView {
    .....

    override class func layerClass() -> AnyClass {
        return CircleProgressLayer.self
    }
}

Пример 1:

Предполагая, что у вас есть вид с поддержкой CATextLayer, мы можем анимировать цвет его переднего плана следующим образом и запустить другую анимацию относительно времени:

var midPointColor = UIColor.orange.cgColor
var finalColor    = UIColor.orange.cgColor
var keyPath       = "foregroundColor"

textView.animate { [unowned self] (a) in
    a.value(midPointColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)

    // This will trigger the interruption 
    // at 0.5 seconds into the animation

    animator.triggerOnProgress(0.5, onView: self.textView, animator: { (a) in
        a.value(finalColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
    })
}

Пример 2:

Так же, как и в предыдущем примере, когда у вас есть представление с поддержкой CATextLayer, мы можем анимировать его foregroundColor относительно матрицы прогресса значений RBG, рассчитанной на основе величины прогресса 3 значений:

var midPointColor = UIColor.orange.cgColor
var finalColor    = UIColor.orange.cgColor
var keyPath       = "foregroundColor"

textView.animate { [unowned self] (a) in
    a.value(midPointColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)

    // This will trigger the interruption 
    // when the magnitude of the starting point
    // is equal to 0.5 relative to the final point

    a.triggerOnValueProgress(0.5, onView: self.textView, animator: { (a) in
        a.value(finalColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
    })
}

Надеюсь, это поможет:)

...