본문 바로가기

iOS

Autolayout Animation

728x90

AutoLayout을 이용한, AutoLayout에 제약 조건이 걸려 있을 때 애니메이션을 어떻게 줄 수 있을지 알아보도록 하겠습니다. 

 

예를 들어서, 화면의 X/Y의 center에 크기가 50인 사각형이 있다고 가정해보겠습니다.

(제약 조건은 위에서 말한 조건이 될 것입니다.)

그리고 해당 view에 대해서 크기가 증가하는 애니메이션을 구현하겠습니다.

 

@IBOutlet weak var view: UIView!
@IBOutlet weak var widthConstraint: NSLayoutConstraint!
@IBOutlet weak var heightConstraint: NSLayoutConstraint!

@IBAction func animate(_ sender: Any) {
	UIView.animate(withDuration: 0.5) {
    	self.widthConstraint.constant = 200
        self.heightConstraint.constant = 200
    }
}

위의 코드를 실행하면, 애니메이션이 작동하지 않는 것을 확인할 수 있습니다.

 

📌 frame이 아닌 AutoLayout으로 제약을 걸었다면, 다른 방식으로 애니메이션을 주어야 합니다.

어떻게 애니메이션을 구현해야 할까요? 아래의 두 단계를 거쳐야 합니다.

  1. UIView.animate 외부에 원하는 애니메이션 조건을 작성합니다.
  2. UIView.animate 내부에 self.layoutIfNeeded()를 호출해서 즉시 애니메이션을 업데이트 합니다.

 

코드로 보면 아래와 같습니다. ⬇️

@IBAction func animate(_ sender: Any) {
	
    // 1. 원하는 제약 조건
    widthConstraint.constant = 200
    heightConstraint.constant = 200
    
    // 2. 업데이트
    UIView.animate(withDuration: 0.5) {
    	self.view.layoutIfNeeded()
    }
}

 

만약, 위의 코드로 작성해도 애니메이션이 적용되지 않는다면?

✅ 애니메이션을 업데이트 하길 원하는 객체에 setNeedsUpdateConstraints()를 추가해야 합니다.

 

🧐 setNeedsUpdateConstraints()

제약 조건이 필요하기 직전, 한 번에 업데이트를 하면 레이아웃 간 view를 여러 번 업데이트 할 때 제약 조건을 불필요하게 재계산 할 필요가 없습니다. 

 

코드로 보면 아래와 같습니다. ⬇️

@IBAction func animate(_ sender: Any) {
	
    widthConstraints.constant = 200
    heightConstraints.constant = 200   
    view.setNeedsUpdateConstraints()
    
    UIView.animate(withDuration: 0.5) {
    	self.view.layoutIfNeeded()
    }
}

'iOS' 카테고리의 다른 글

개발자 계정 팀 인증서 등록  (1) 2022.04.21
Apple Developer Pending  (0) 2022.04.19
iOS-Concurrency  (0) 2022.04.09
SwiftGen  (0) 2022.04.05
UIStackView  (0) 2022.04.04