2015-09-04 4 views
1

У меня есть loginViewController, который появляется постоянно, когда пользователь не вошел в систему. Я хотел бы оживить фон этого окна. Я попробовал два метода: UIViewAnimateWithDuration, добавив подвью и CABasicAnimation, добавив подслой. Ни анимация не работает. Подслой и подвью выводятся, но они не анимированы.Как мне оживить подслои и подпункты?

Первая анимация - animateWithDuration. Он пытается переместить рисованный прямоугольник в случайную точку на оси y. Вторая анимация - CABasicAnimation для непрозрачности, изменяя альфа рисованного прямоугольника от 1 до 0. Мне не важно, будет ли я использовать анимацию вида или анимацию слоя, и будет достаточно, но не нажимаем.

func makeBackground() -> UIView { 

    let backRect = UIView() 
    backRect.frame = self.view.bounds 
    backRect.backgroundColor = backgroundColor 

    let floater2 = UIView(frame: CGRectMake(25.0, 0.0, 25, 25)) 
    floater2.backgroundColor = backgroundColor 
    floater2.layer.borderWidth = 1.0 
    floater2.layer.borderColor = lowColor.CGColor 
    floater2.alpha = 0.0 

    backRect.addSubview(floater2) 

    UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: {() -> Void in 

     let randomY = CGFloat(arc4random_uniform(568))    
     floater2.frame.origin.y = randomY 

    }, completion: nil) 



    let floater1 = CALayer() 
    floater1.frame = CGRectMake(0.0, 0.0, 25, 25) 
    floater1.backgroundColor = UIColor.redColor().CGColor 

    let animation = CABasicAnimation(keyPath: "opacity") 
    animation.fromValue = 1.0 
    animation.toValue = 0.0 
    animation.repeatCount = 100 
    animation.duration = 2.0 

    floater1.addAnimation(animation, forKey: "opacity") 

    backRect.layer.addSublayer(floater1) 

    return backRect 
} 

И тогда я присвоить результат функции в переменную при представлении контроллер представления Логин:

 var loginViewController = PFLogInViewController() 
     loginViewController.delegate = self 
     loginViewController.fields = PFLogInFields.Default 
      | PFLogInFields.Facebook 
      | PFLogInFields.Twitter 

     loginViewController.logInView?.backgroundColor = backgroundColor 

     var bg = self.makeBackground() 

     loginViewController.logInView?.addSubview(bg) 
     loginViewController.logInView?.sendSubviewToBack(bg) 

enter image description here

ответ

1

Проблема с этим кодом:

backRect.addSubview(floater2) 
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: {() -> Void in 
    floater2.frame.origin.y = randomY 

... заключается в том, что вы пытаетесь анимировать что-то, что не является частью рендеринга t Ри. Вам необходимо предоставить «сердцебиение» после addSubview, так что floater2 - это часть дерева рендеринга - то есть на самом деле это в интерфейсе - перед началом его анимации. Короткая задержка будет делать:

backRect.addSubview(floater2) 
delay(0.1) { 
    UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: {() -> Void in 
     floater2.frame.origin.y = randomY 

(где delay есть, или аналогично, моя функция полезности здесь: https://stackoverflow.com/a/24318861/341994).

Проблема с анимацией слоя параллельна. Вы не можете анимировать слой до тех пор, пока он не появится в дереве рендеринга. Фактически, поскольку вид - это слой, и, поскольку на самом деле анимация просмотра - это анимация слоя, это идентично той же проблеме.

+1

Вы мужчина! Это было именно так. Спасибо. –