2014-12-26 5 views
20

ViewController.Swift에서 한 지점에서 다른 지점으로 애니메이션을 만들 수있었습니다. 상자를 한 지점으로 움직이게 한 다음 원래 위치로 다시 애니메이션 한 다음 다시 반복하도록이 루프를 반복하는 것이 쉽다는 것을 알았습니다. 나는 개체를 위치로 옮길 수 있었고 "완전한"이동은 다시 되돌려 놓았지만 루프가되지는 않습니다. 어떻게이 일을 성취 할 수 있습니까?UIView.animateWithDuration 스위프트 루프 애니메이션

나는이 작업을 할 수 어쩌면 생각하지만 난 솔직히 모르겠어요

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 
} 

어떻게 장치 폭에 기반을 중심으로 수 (나는 참여 약간의 수학이있는 가정?)?

내 코드 :

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

답변

66

바로 애니메이션 옵션 인수를 사용하여 완료 블록 접근을 할 필요가 없습니다 :

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

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

}, completion: nil) 

스위프트 3.0 업데이트를 어떤을위한 경우 나중에 애니메이션을 중단하려는 이유 :

coloredSquare.layer.removeAllAnimations() 
+0

와우, 그렇게 쉬웠다. @Mazyod 감사합니다! 기기 너비를 기준으로 센터를 중앙에 배치하는 방법을 알고 있습니까? –

+1

@JohanNdiyoLinnarsson 글쎄, 당신은 모든 하드 코딩 된 값을 분명히 제거해야 할 것입니다. 원하는 크기로 프레임을 설정 한 다음 프레임 대신'coloredSquare.center' 속성에 애니메이션을 적용 해보십시오. 보기에 가운데 놓으려면'coloredSquare.center = view.center' 또는 더 나은'coloredSquare.center = CGPoint (x : view.bounds.midX, y : view.bounds.midY)' – Mazyod

+0

을 사용하십시오. autolayout을 사용하면 autoresizingMask 속성을 유연한 여백으로 설정해야합니다. – Mazyod

관련 문제