2015-01-15 3 views
-1

Очень новое к этому извините!анимация UIView пропускает первую анимацию

Как только я бегу, нажмите кнопку «нажмите» Цвет фона UIView «Фон» мгновенно меняется на синий, а затем оживляет до фиолетового, полностью пропуская анимацию на желтый, а затем на синий.

Что я сделал не так?

@IBAction func Press(sender: AnyObject) { 

UIView.animateWithDuration(5, animations: { 
self.Background.backgroundColor = UIColor.yellowColor() 
self.Background.backgroundColor = UIColor.blueColor() 
self.Background.backgroundColor = UIColor.purpleColor() 
}, completion:{(Bool) in 
println("COLOR CHANGED") 
}) 
} 
+0

Кстати, этот код не так: '(Bool) в'. Это не вызывает ошибки, но это не делает то, что вы думаете. Просто напишите '_ in'. – matt

+0

И прекратите использовать заглавные буквы для имен функций и имен переменных! Заглавные буквы предназначены для имен классов. – matt

ответ

2

Вы не можете анимировать более одного государственного изменения в эту же собственность в одном UIView.animateWithDuration позвонить. Он просто оживит последнее изменение состояния (как в вашем случае). Вместо этого вы можете связать их вместе, используя completionBlock.

UIView.animateWithDuration(5/3.0, animations: { 

    self.view.backgroundColor = UIColor.yellowColor() 

    }, completion:{ finished1 in 
     UIView.animateWithDuration(5/3.0, animations: { 

      self.view.backgroundColor = UIColor.blueColor() 

      }, completion:{finished2 in 
       UIView.animateWithDuration(5/3.0, animations: { 

        self.view.backgroundColor = UIColor.purpleColor() 

        }, completion:{finished3 in 

         println("COLOR CHANGED") 
       }) 
     }) 
}) 

Или вы можете использовать анимацию ключевого кадра, указав промежуточные кадры, как показано ниже. Значение relativeDuration должно быть значением от 0 до 1, что указывает на относительную продолжительность одного ключевого кадра. например, если вся анимация равна 3 seconds, а relativeDuration - (1/3), то этот ключевой кадр будет анимироваться для 3/3 = 1 секунд.

relativeStartTime аналогично относительное время, после которого ключевой кадр начинается с продолжительности всей анимации. например, если вся анимация 3 seconds и relativeStartTime является (1/3), то, что ключевой кадр начинается после 1 second

var duration = 5.0; 
var relativeDuration = 1.0/3; 

UIView.animateKeyframesWithDuration(duration, delay: 0, options: nil, animations: { 
    UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: relativeDuration, animations: { 
     self.view.backgroundColor = UIColor.yellowColor() 
    }) 
    UIView.addKeyframeWithRelativeStartTime(relativeDuration, relativeDuration: relativeDuration, animations: { 
     self.view.backgroundColor = UIColor.blueColor() 
    }) 
    UIView.addKeyframeWithRelativeStartTime(2 * relativeDuration, relativeDuration: relativeDuration, animations: { 
     self.view.backgroundColor = UIColor.purpleColor() 

    }) 
    }, completion:nil); 
2

Правильно, потому что это все один изменение один собственности. Вы должны сделать это трех последовательных различных анимаций. Сначала оживить до желтого; когда это закончится, теперь сделайте совершенно новую анимацию синей; затем сделайте совершенно новую анимацию фиолетовым.

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

@IBAction func press(sender: AnyObject) { 
    UIView.animateWithDuration(5.0/3.0, animations: { 
     self.background.backgroundColor = UIColor.yellowColor() 
     }, completion:{(Bool) in 
      UIView.animateWithDuration(5.0/3.0, animations: { 
       self.background.backgroundColor = UIColor.blueColor() 
       }, completion:{(Bool) in 
        UIView.animateWithDuration(5.0/3.0, animations: { 
         self.background.backgroundColor = UIColor.purpleColor() 
         }, completion:{(Bool) in 
          println("COLOR CHANGED") 
        }) 
      }) 
    }) 
} 

КСН 8 есть также более изящный (но сложнее) путь, который должен используйте анимацию ключевого кадра. Но для начала я бы посоветовал вам сделать это простым способом!

+0

Спасибо за ответ! Как я получу весь этот код для бесконечного повторения? – PugLvr28

+0

Лично я бы так не сделал. Я бы использовал анимацию ключевого кадра и установил, чтобы она повторялась бесконечно. Или даже сделать все это на уровне Core Animation; см. мою книгу о том, как это сделать: http://www.apeth.com/iOSBook/ch17.html#_core_animation – matt

Смежные вопросы