자동 레이아웃 체인은 기본적으로 3 가지 프로세스로 구성됩니다.
- 구속 조건 업데이트
- 레이아웃 뷰 (여기서 프레임 계산을 수행하는 위치)
- 디스플레이
무엇 완전히 나에게 분명하지 않다 것은 사이의 내부 차이 -setNeedsLayout
와 -setNeedsUpdateConstraints
. Apple Docs에서 :
뷰의 서브 뷰 레이아웃을 조정하려면 응용 프로그램의 메인 스레드에서이 메소드를 호출하십시오. 이 메소드는 요청을 기록하고 즉시 리턴합니다. 이 방법은 즉시 업데이트를 강제하지 않지만 대신 다음 업데이트주기를 기다리기 때문에 여러 뷰의 레이아웃을 무효화하여 해당 뷰를 업데이트 할 수 있습니다. 이 동작을 통해 모든 레이아웃 업데이트를 한 번의 업데이트 주기로 통합 할 수 있으며 이는 일반적으로 성능이 향상됩니다.
사용자 지정 뷰의 속성이 제약 조건에 영향을주는 방식으로 변경되면이 메서드를 호출하여 나중에 제약 조건을 업데이트해야 함을 나타낼 수 있습니다. 그런 다음 시스템은 일반 레이아웃 패스의 일부로 updateConstraints를 호출합니다. 구속 조건을 요구하기 바로 전에 한 번에 모두 구속 조건을 업데이트하면 배치 단계 사이에서 뷰를 여러 번 변경할 때 구속 조건을 불필요하게 다시 계산할 필요가 없습니다.
제약 조건을 수정 한 후 뷰에 애니메이션을 적용하고 변경 사항에 애니메이션을 적용하려면 일반적으로 예를 들어 호출합니다.
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
내가 사용하는 경우 사실을 발견했습니다 -setNeedsLayout
대신 -setNeedsUpdateConstraints
모든 작업이 예상대로,하지만 난 변경하는 경우 -layoutIfNeeded
로 -updateConstraintsIfNeeded
, 애니메이션은 일어나지 않을 것입니다.
나는 내 자신의 결론을 만들려고 노력했다.
-updateConstraintsIfNeeded
구속 조건 만 업데이트하지만 레이아웃을 강제로 프로세스로 가져 오지 않으므로 원본 프레임이 계속 유지됩니다.-setNeedsLayout
-updateContraints
메소드 도 호출
그렇다면 언제 다른 것을 사용하는 것이 좋을까요? 레이아웃 방법에 대해 제약 조건이나 상위 뷰가 변경된 뷰에서 호출해야합니까?