Сработала задержка метки замирания при просмотре, а не в конце предыдущего замирания - PullRequest
1 голос
/ 14 июня 2019

Фон

Благодаря отличному ответу здесь , мне удалось сделать серию этикеток постепенно исчезающими.

Однако задержка, упомянутая в функции в расширении, срабатывает только после завершения предыдущего затухания (я думаю), поэтому между ними остается не менее 1 секунды.В идеале я хочу отредактировать модель так, чтобы задержка относилась ко времени загрузки представления, а не ко времени завершения предыдущего.

т.е. если я сделаю задержку довольно маленькой, вторая начнет исчезать до того, как закончится первая.

Это расширение:

extension UIView {

    func fadeIn(duration: TimeInterval = 1.0, delay: TimeInterval = 0.0, completion: ((Bool)->())? = nil) {
        self.alpha = 0.0
        UIView.animate(withDuration: duration, delay: delay, options: .curveEaseIn, animations: {
            self.alpha = 1.0
        }, completion: completion)
    }
}

иэто моя реализация на VC с 6 метками:

func animateLabels() {
    self.titleOutlet.alpha = 0.0
    self.line1Outlet.alpha = 0.0
    self.line2Outlet.alpha = 0.0
    self.line3Outlet.alpha = 0.0
    self.line4Outlet.alpha = 0.0
    self.line5Outlet.alpha = 0.0
    self.line6Outlet.alpha = 0.0
    self.titleOutlet.fadeIn(delay: 0.2, completion: { _ in
    self.line1Outlet.fadeIn(delay: 0.4, completion: { _ in
    self.line2Outlet.fadeIn(delay: 0.6, completion: { _ in
    self.line3Outlet.fadeIn(delay: 0.8, completion: { _ in
    self.line4Outlet.fadeIn(delay: 1.0, completion: { _ in
    self.line5Outlet.fadeIn(delay: 1.2, completion: { _ in
    self.line6Outlet.fadeIn(delay: 1.4, completion: { _ in
    })})})})})})})
    }

К чему я пытаюсь добраться?

Так что я пытаюсь добраться долиния line2outlet начинает исчезать через 0,4 секунды после загрузки страницы, но начинается только после того, как строка line1 закончила исчезать (это занимает 1 секунду и задерживается на 0,2 с).

Что я пробовал?

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

func delay(interval: TimeInterval, closure: @escaping () -> Void) {
            DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
                closure()
            }
        }

и реализовать так:

self.line1Outlet.fadeIn(delay: 0, completion: { _ in
        delay(interval: 1, closure: ()->Void)

, но получило множество ошибок!Я также попытался установить минус числа для задержек, но это тоже не сработало.

Любая помощь очень ценится!

1 Ответ

1 голос
/ 14 июня 2019

Одним из возможных решений, которое я использовал ранее, является использование цикла с возрастающей переменной задержки, подающего в стандартный метод UIView.animate(). Этот метод не использует обработчики завершения.

Создайте массив меток:

var labels = [titleOutlet, line1Outlet] // etc...

Используйте это расширение:

extension UIView {
    func fadeIn(duration: TimeInterval = 1, delay: TimeInterval = 0) {
        self.alpha = 0
        UIView.animate(withDuration: duration, delay: delay, options: [], animations: { self.alpha = 1 }, completion: nil)
    }
}

Тогда используйте это так:

var delay = 0.2
var duration = 0.5

for label in labels {
    label.fadeIn(duration: duration, delay: delay)
    delay += 0.2 // Increment delay
}
...