2014-12-26 15 views
20

In ViewController.Swift Udało mi się zrobić animację z jednego punktu do drugiego. Pomyślałem, że będzie to łatwe do zapętlenia, więc pudełko będzie animowało się do jednego punktu, a następnie ożywi z powrotem do swojej pierwotnej pozycji, a następnie ponownie wykona pętlę. Udało mi się przesunąć obiekt na pozycję i "ukończyć" go przenieść z powrotem, ale to nie powoduje, że jestem w pętli. Jak można to osiągnąć?UIView.animateWithDuration swift loop animation

Myślałem, że może to może działać, ale szczerze mówiąc nie wiem:

let boxmoves = [CGRect(x: 120, y: 220, width: 100, height: 100), CGRect(x: 120, y: 120, width: 100, height: 100)] 
for boxmove in boxmoves { 
    coloredSquare.frame = boxmove 
} 

Jak mogę wyśrodkować go w oparciu o urządzenia szerokości (zakładam istnieją pewne matematyki zaangażowany?)?

Mój kod:

let coloredSquare = UIView() 

coloredSquare.backgroundColor = UIColor.blueColor() 

coloredSquare.frame = CGRect(x: 120, y: 120, width: 100, height: 100) 

self.view.addSubview(coloredSquare) 

// found repeate but this will not animate as I want. 
//UIView.animateWithDuration(2.0, delay: 0.2, options: UIViewAnimationOptions.Repeat, animations: { 
UIView.animateWithDuration(2.0, animations: { 

    coloredSquare.frame = CGRect(x: 120, y: 220, width: 100, height: 100) 

    }, completion: { finished in 
     UIView.animateWithDuration(2.0, animations: { 
     coloredSquare.frame = CGRect(x: 120, y: 120, width: 100, height: 100) 
     }) 
}) 

Odpowiedz

66

Nie trzeba robić podejście blok zakończenie, po prostu użyć argumentu opcji Animacja:

zaktualizowany do Swift 3.0

UIView.animate(withDuration: 2.0, delay: 0, options: [.repeat, .autoreverse], animations: { 

    coloredSquare.frame = CGRect(x: 120, y: 220, width: 100, height: 100) 

}, completion: nil) 

Jeżeli dla dowolnej powód, dla którego chcesz zatrzymać animację później, użyj:

coloredSquare.layer.removeAllAnimations() 
+0

Wow, to było takie proste. Dzięki @Mazyod! Czy wiesz, jak je wyśrodkować na podstawie szerokości urządzenia? –

+1

@JohanNdiyoLinnarsson Cóż, oczywiście musisz usunąć wszystkie te wartości zakodowane. Spróbuj ustawić ramkę o żądanym rozmiarze, a następnie animuj właściwość 'coloredSquare.center' zamiast ramki. Aby wyśrodkować go w widoku, wypróbuj 'coloredSquare.center = view.center' lub lepiej' coloredSquare.center = CGPoint (x: view.bounds.midX, y: view.bounds.midY) ' – Mazyod

+0

jeśli nie jesteś używając autolayout, musisz również ustawić właściwość 'autoresizingMask' na elastyczne marginesy. – Mazyod