2015-04-24 5 views
1

У меня есть , содержащий ["alice", "bob", "charles"] и UILabellabel. Я хочу, чтобы label неоднократно исчезал и выходил, с другим словом от words каждый раз. Если я кладу текст меняющегося кода внутри animations блока, он не выполняет, несмотря на то, замирание работает, как ожидалось (completion блока запускается только тогда, когда что-то останавливает повторение):Как изменить текст UILabel между каждой анимацией animateWithDuration с повторением?

label.alpha = 0 

UIView.animateWithDuration(4, delay: 0, options: .Autoreverse | .Repeat, animations: { 
    self.label.text = nextWord() 
    self.label.alpha = 1 
}, completion: {_ in 
    NSLog("Completed animation") 
}) 

Что такое хорошо способ исправить это? Благодарю.

ответ

2

, конечно, не самый элегантный, но рабочий раствор:

@IBOutlet weak var label: UILabel! 

let words = ["Is", "this", "what", "you", "want?"] 
var currentIndex = -1 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    showNextWord() 
} 

func showNextWord() { 
    if currentIndex == words.count - 1 { 
     currentIndex = -1 
    } 

    UIView.animateWithDuration(1, delay: 1, options: UIViewAnimationOptions(0), animations: {() -> Void in 
     self.label.alpha = 0.0 
    }) { (_) -> Void in 
     self.label.text = self.words[++self.currentIndex] 
     UIView.animateWithDuration(1, animations: {() -> Void in 
      self.label.alpha = 1.0 
      }, completion: { (_) -> Void in 
       self.showNextWord() 
     }) 
    } 
} 
+1

Когда я переключаюсь на другой View Controller, рекурсия продолжаться вечно, и запретите это, я проверил, что «завершенный», предоставленный нам в «завершении», является истинным до рекурсии. В противном случае это работает отлично. Благодарю. – user3770280

+0

хорошо пункт. пожалуйста! :) –

+0

Но в действии завершения нет завершенных булевых данных ... Вы говорите о собственной ценности? –

1

Вы можете создать это как анимацию ключевого кадра. Таким образом, вы можете связать три анимации вместе (по одному для каждого слова) и повторить, что целых цепь.

В качестве альтернативы (это то, что я, вероятно, сделал бы), поместил бы одну анимацию в свой собственный метод, а в блоке завершения добавит короткую задержку и вызовет метод - таким образом создавая бесконечный цикл. Цикл создает повторение, но каждая анимация всего лишь одна анимация, поэтому теперь вы можете прогрессировать по массиву при последовательных вызовах. Таким образом, структура (псевдо-код) будет выглядеть следующим образом:

func animate() { 
    let opts = UIViewAnimationOptions.Autoreverse 
    UIView.animateWithDuration(1, delay: 0, options: opts, animations: { 
     // animate one fade in and out 
    }, completion: { 
     _ in 
     delay(0.1) { 
      // set the next text 
      self.animate() // recurse after delay 
     } 
    }) 
} 
Смежные вопросы