淡入淡出字符串数组
Fading an array of strings in and out
使用swift我能够让单词"Hello, World"每2秒淡入淡出,延迟3秒。
让多个字符串 (5-8) 一次一个地重复淡入淡出的最佳方法是什么?
谢谢!
您需要一对嵌套动画,一个处理淡入,另一个处理淡出。您可以在第一个的完成块中调用第二个。
然后你需要更改消息,然后为新消息设置动画,这只是再次调用动画对。这是一种方法:
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let theMessages=["Message 1","Message 2","The third message","The final message"]
var messageIndex=0;
override func viewDidLoad() {
super.viewDidLoad()
self.label.text=""
self.label.alpha=0;
self.animateMessage()
}
func animateMessage() {
self.label.text=self.theMessages[self.messageIndex];
if (++self.messageIndex == self.theMessages.count) {
self.messageIndex=0;
}
UIView.animateWithDuration(2.0, delay: 0.5, options: .CurveEaseInOut, animations: { () -> Void in
self.label.alpha=1.0
}, completion: { (success) -> Void in
UIView.animateWithDuration(2.0, delay: 0.5, options: .CurveEaseInOut, animations: { () -> Void in
self.label.alpha=0
}, completion: { (success) -> Void in
self.animateMessage()
})
})
}
}
在已接受答案的变体中,每当您发现自己嵌套动画时,通常可以使用关键帧动画:
@IBOutlet weak var label: UILabel!
let messages = ["Message 1", "Message 2", "The third message", "The final message"]
override func viewDidLoad() {
super.viewDidLoad()
changeTextForLabel(label, index: 0)
}
func changeTextForLabel(label: UILabel, index: Int) {
label.text = messages[index]
label.alpha = 0
UIView.animateKeyframesWithDuration(5, delay: 0, options: [], animations:
{
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.2) { label.alpha = 1 }
UIView.addKeyframeWithRelativeStartTime(0.8, relativeDuration: 0.2) { label.alpha = 0 }
}, completion: { [weak self] finished in
let nextIndex = index + 1
self?.changeTextForLabel(label, index: nextIndex < self?.messages.count ? nextIndex : 0)
})
}
或者,如果您不想淡出,而是希望在值之间有一个很好的交叉溶解,您可以执行以下操作:
func changeTextForLabel(label: UILabel, index: Int) {
UIView.transitionWithView(label, duration: 3.0, options: .TransitionCrossDissolve, animations:
{
self.label.text = self.messages[index]
}, completion: { [weak self] finished in
let nextIndex = index + 1
self?.changeTextForLabel(label, index: nextIndex < self?.messages.count ? nextIndex : 0)
})
}
使用swift我能够让单词"Hello, World"每2秒淡入淡出,延迟3秒。
让多个字符串 (5-8) 一次一个地重复淡入淡出的最佳方法是什么?
谢谢!
您需要一对嵌套动画,一个处理淡入,另一个处理淡出。您可以在第一个的完成块中调用第二个。
然后你需要更改消息,然后为新消息设置动画,这只是再次调用动画对。这是一种方法:
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let theMessages=["Message 1","Message 2","The third message","The final message"]
var messageIndex=0;
override func viewDidLoad() {
super.viewDidLoad()
self.label.text=""
self.label.alpha=0;
self.animateMessage()
}
func animateMessage() {
self.label.text=self.theMessages[self.messageIndex];
if (++self.messageIndex == self.theMessages.count) {
self.messageIndex=0;
}
UIView.animateWithDuration(2.0, delay: 0.5, options: .CurveEaseInOut, animations: { () -> Void in
self.label.alpha=1.0
}, completion: { (success) -> Void in
UIView.animateWithDuration(2.0, delay: 0.5, options: .CurveEaseInOut, animations: { () -> Void in
self.label.alpha=0
}, completion: { (success) -> Void in
self.animateMessage()
})
})
}
}
在已接受答案的变体中,每当您发现自己嵌套动画时,通常可以使用关键帧动画:
@IBOutlet weak var label: UILabel!
let messages = ["Message 1", "Message 2", "The third message", "The final message"]
override func viewDidLoad() {
super.viewDidLoad()
changeTextForLabel(label, index: 0)
}
func changeTextForLabel(label: UILabel, index: Int) {
label.text = messages[index]
label.alpha = 0
UIView.animateKeyframesWithDuration(5, delay: 0, options: [], animations:
{
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.2) { label.alpha = 1 }
UIView.addKeyframeWithRelativeStartTime(0.8, relativeDuration: 0.2) { label.alpha = 0 }
}, completion: { [weak self] finished in
let nextIndex = index + 1
self?.changeTextForLabel(label, index: nextIndex < self?.messages.count ? nextIndex : 0)
})
}
或者,如果您不想淡出,而是希望在值之间有一个很好的交叉溶解,您可以执行以下操作:
func changeTextForLabel(label: UILabel, index: Int) {
UIView.transitionWithView(label, duration: 3.0, options: .TransitionCrossDissolve, animations:
{
self.label.text = self.messages[index]
}, completion: { [weak self] finished in
let nextIndex = index + 1
self?.changeTextForLabel(label, index: nextIndex < self?.messages.count ? nextIndex : 0)
})
}