在 Swift 中使一组视图动画化以在 StackView 中一个接一个地出现的最佳方法是什么?
Whats the best way in Swift to animate an array of NSViews to appear one after another in an NSStackView?
我可以使用以下代码将多个 NSTextFields 添加到 NSStackView:
optionsStackView.addView(newOption, in: .center)
我遇到的问题是让每个 NSTextField (newOption) 在视图出现时一个接一个地出现——在使用 NSAnimationContext.runAnimationGroup { (context) in }
时不是一次全部出现
let stackViewSubViews = optionsStackView?.arrangedSubviews.enumerated()
stackViewSubViews!.forEach({ newOption in
NSAnimationContext.runAnimationGroup { (context) in
context.duration = 1
newOption.element.animator().alphaValue = 1
}
})
每次 for 循环运行时,我基本上需要 delay 半秒,以便为所有 NSTextFields 显示一个接一个的 NSTextField,但我不太明白如何去做这个。我查看了使用 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
,但无法完全弄清楚在没有所有内容同时出现的情况下完成这项工作的代码...
我确定我在这里遗漏了一些简单的东西。
有人可以帮忙吗?
在循环的每次迭代中插入延迟的最简单方法是将循环变成递归。我将向您展示一般技术,您可以根据自己的用例对其进行调整:
func slowly(from i:Int, to n:Int) {
print(i)
if i != n {
DispatchQueue.main.asyncAfter(deadline:.now()+0.5) {
slowly(from:i+1, to:n)
}
}
}
slowly(from:1, to:3)
我可以使用以下代码将多个 NSTextFields 添加到 NSStackView:
optionsStackView.addView(newOption, in: .center)
我遇到的问题是让每个 NSTextField (newOption) 在视图出现时一个接一个地出现——在使用 NSAnimationContext.runAnimationGroup { (context) in }
时不是一次全部出现 let stackViewSubViews = optionsStackView?.arrangedSubviews.enumerated()
stackViewSubViews!.forEach({ newOption in
NSAnimationContext.runAnimationGroup { (context) in
context.duration = 1
newOption.element.animator().alphaValue = 1
}
})
每次 for 循环运行时,我基本上需要 delay 半秒,以便为所有 NSTextFields 显示一个接一个的 NSTextField,但我不太明白如何去做这个。我查看了使用 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
,但无法完全弄清楚在没有所有内容同时出现的情况下完成这项工作的代码...
我确定我在这里遗漏了一些简单的东西。
有人可以帮忙吗?
在循环的每次迭代中插入延迟的最简单方法是将循环变成递归。我将向您展示一般技术,您可以根据自己的用例对其进行调整:
func slowly(from i:Int, to n:Int) {
print(i)
if i != n {
DispatchQueue.main.asyncAfter(deadline:.now()+0.5) {
slowly(from:i+1, to:n)
}
}
}
slowly(from:1, to:3)