触发淡入淡出标签延迟从视图确实加载,而不是在上一个淡出结束时

时间:2019-06-14 19:45:46

标签: ios swift swift4 fadein

背景

借助出色的答案aggregation,我设法使一系列标签按顺序淡入。

但是,扩展中功能中提到的延迟仅在前一个淡入淡出完成时才触发(我认为),因此它们之间至少存在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)
    }
}

这是我在带有6个标签的VC上的实现:

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.2s)后才开始。

我尝试了什么?

我尝试在读取后编写自己的延迟函数。我尝试将其添加到扩展中:

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 个答案:

答案 0 :(得分:1)

我以前使用过的一种可能的解决方案是使用一个循环,该循环的延迟变量递增,并输入到标准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
}