背景
借助出色的答案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)
但是有很多错误!我还尝试为延迟设置负号,但这也不起作用。
任何帮助,不胜感激!
答案 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
}