【问题标题】:Sequential fade in SwiftSwift 中的顺序淡入淡出
【发布时间】:2019-06-12 10:14:20
【问题描述】:

我正在使用出色的答案 here 来实现文本标签的淡入。

但是,我想引入一个延迟,以便我可以顺序淡入多个文本标签。

到目前为止(取自答案),我正在使用:

extension UIView {

    func fadeIn(duration: TimeInterval = 1.0, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in}) {
        UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
            self.alpha = 1.0
        }, completion: completion)  }
}

然后用 :

实现
override func viewDidLoad() {

        self.line1Outlet.alpha = 0
        self.line1Outlet.fadeIn(completion: {
            (finished: Bool) -> Void in
        })

    }

我认为最好的解决方案是将延迟作为扩展中的参数实现,这样我就可以轻松地为每个标签添加不同的延迟。 (例如

override func viewDidLoad() {

        self.line1Outlet.alpha = 0
        //add a parameter here for the delay (here line 1 gets '1second' then line 2 could come in after 2seconds etc)
        self.line1Outlet.delay = 1second
        self.line1Outlet.fadeIn(completion: {
            (finished: Bool) -> Void in
        })

    }

我尝试将 self.delay 添加到扩展中(在 self.alpha 下方),但这不起作用,我不确定如何重构该扩展以允许我所追求的。

这个问题的答案将是实现顺序淡入淡出的可重用方法,希望对许多其他人有用!

【问题讨论】:

    标签: ios swift fadein


    【解决方案1】:

    在你创建的extension中,首先在fadeIn函数的顶部添加self.alpha = 0.0,即

    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)
        }
    }
    

    现在假设您的view 中有 3 个labels,即

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    

    animation按顺序添加到labels

    self.label1.fadeIn(delay: 0.1) { _ in
        self.label2.fadeIn(delay: 0.2, completion: { _ in
            self.label3.fadeIn(delay: 0.3, completion: { _ in
                print("Done All")
            })
        })
    }
    

    由于fadeIn 方法中的duration parameter 有一个default value,我们可以避免这种情况。

    您调用fadeIn 的方式是一种调用方式。由于该方法包含多个default params,因此也可以通过其他方式调用。

    阅读更多关于default parametershere的信息。

    编辑:

    为了最初隐藏labels,在storyboard 本身中将所有labels 中的alpha 设置为0

    【讨论】:

    • 嗯,这在模拟器中对我不起作用,打印语句正在工作,但没有动画发生
    • 初始设置所有标签的alpha为0。另请参阅我添加的 gif。
    • 谢谢 - 现在效果更好,但我在所有标签都显示的地方得到了它。然后每个都消失,然后以正确的延迟值淡入。我如何使它最初隐藏起来?我像你说的那样在顶部设置了 alpha = 0
    • 为了最初隐藏它们,在故事板本身中将所有标签的 alpha 设置为 0..
    • 啊,好吧——有没有办法在模型中设置它(我认为这就是 self.alpha = 0 在这条线上应该做的)。那么,如果标签已应用淡入淡出,它最初也会将其设置为 0 吗?如果没有,不用担心,这很好用,我会将其标记为正确 func fadeIn(duration: TimeInterval = 1.0, delay: TimeInterval = 0.0, completion: ((Bool)->())? = nil) { self.alpha = 0.0
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多