淡入淡出字符串数组

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