该问题是由您在此处使用的
for
循环引起的。您无法以这种方式获得所需的行为。
for
循环不会等待您的标签动画完成后才开始下一次迭代。相反,您可以在每个动画周期完成后从方法本身进行递归调用。
您需要在您的类中声明一个变量,并像下面这样实现该方法:
Swift 5及以上版本更新:
var iterator = 1;
override func viewDidLoad() {
super.viewDidLoad()
self.lblAnime!.text = "Welcome"
setOverlayTitle()
}
func setOverlayTitle() {
let hello: [String] = ["Bon Jour", "GUTEN\nMORGEN", "BONJOUR", "HOLA", "안녕하세요", "BUENOS DÍAS", "BUONGIORNO", "早安", "おはよう", "गुड मॉर्निंग"]
UIView.animate(withDuration: 1.0, delay: 2.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
self.lblAnime!.alpha = 0.0
}, completion: { (finished: Bool) -> Void in
self.lblAnime!.text = hello[self.iterator]
UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveEaseIn, animations: {
self.lblAnime!.alpha = 1.0
}, completion: { (finished: Bool) -> Void in
self.iterator += 1
if self.iterator < hello.count {
self.setOverlayTitle();
}
})
})
}
原始答案(旧版本的Swift):
var iterator = 1;
override func viewDidLoad()
{
super.viewDidLoad()
self.lblAnime!.text = "Welcome"
setOverlayTitle()
}
func setOverlayTitle()
{
var hello: [String] = ["Bon Jour", "GUTEN\nMORGEN", "BONJOUR", "HOLA", "안녕하세요", "BUENOS DÍAS", "BUONGIORNO", "早安", "おはよう", "गुड मॉर्निंग"]
UIView.animateWithDuration(1.0, delay: 2.0, options: UIViewAnimationOptions.CurveEaseOut, animations:
{
self.lblAnime!.alpha = 0.0
},
completion:
{(finished: Bool) -> Void in
println(self.iterator)
self.lblAnime!.text = hello[self.iterator]
UIView.animateWithDuration(1.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations:
{
self.lblAnime!.alpha = 1.0
},
completion:
{(finished: Bool) -> Void in
self.iterator++
if self.iterator < hello.count
{
self.setOverlayTitle();
}
})
})
}
for (var i = 0; i < hello.count-1; i++)
- user3857868self.overlayLogo!.text =“test”
。这样做有效吗?如果有效,那么问题就被缩小了。 - user3857868