setNeedsLayout vs. setNeedsUpdateConstraints 및 레이아웃IfNeeded vs updateConstraints필요한 경우
자동차 레이아웃 체인은 기본적으로 3개의 다른 프로세스로 구성되어 있는 것으로 알고 있습니다.
- 업데이트, 제약 조건
- 레이아웃 뷰(여기서 프레임 계산을 얻을 수 있습니다.
- 표시
알 수것은 입니다.-setNeedsLayout ★★★★★★★★★★★★★★★★★」-setNeedsUpdateConstraints Apple 문서:
보기의 하위 보기 레이아웃을 조정하려면 응용프로그램의 기본 스레드에서 이 메서드를 호출하십시오.이 메서드는 요청을 기록하고 즉시 반환합니다.이 방법은 즉시 업데이트를 강제하지 않고 다음 업데이트 주기를 대기하기 때문에 보기를 업데이트하기 전에 여러 보기의 레이아웃을 비활성화할 수 있습니다.이 동작을 통해 모든 레이아웃 업데이트를 하나의 업데이트 주기에 통합할 수 있으며, 이는 일반적으로 성능을 향상시킵니다.
커스텀 뷰의 속성이 제약조건에 영향을 주는 방법으로 변경되면 이 메서드를 호출하여 향후 어느 시점에서 제약조건을 갱신할 필요가 있음을 나타낼 수 있습니다.그런 다음 시스템은 일반 레이아웃 경로의 일부로 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
그럼 다른 뷰 대신 어느 한쪽을 사용하는 것이 좋을까요?또한 레이아웃 방법에 대해서는 제약조건이 변경된 뷰 또는 부모 뷰 중 어느 쪽을 호출해야 합니까?
당신의 결론은 옳습니다.기본 스킴은 다음과 같습니다.
setNeedsUpdateConstraints의 장래의 을 확인합니다.updateConstraintsIfNeeded®updateConstraints.setNeedsLayout의 장래의 을 확인합니다.layoutIfNeeded콜layoutSubviews.
언제layoutSubviews호출됩니다.또,updateConstraintsIfNeeded그래서 제 경험상 수동으로 전화할 필요가 거의 없습니다.사실 레이아웃을 디버깅할 때 이외에는 호출한 적이 없습니다.
다음을 사용하여 제약 조건 업데이트setNeedsUpdateConstraints꽤 드문 일이기도 해, objc.io – a a autolayout – :::에 대해 읽어보아야 합니다.
나중에 변경되어 제약조건 중 하나가 무효가 되었을 경우 즉시 제약조건을 삭제하고 setNeedsUpdateConstraints를 호출해야 합니다.실제로 제약조건 업데이트 패스를 트리거해야 하는 유일한 경우입니다.
게다가 제 경험상, 저는 제약조건을 무효로 하거나setNeedsLayout새로운 제약조건이 새로운 레이아웃을 요구하기 때문에 코드의 다음 행에 표시됩니다.
경험의 법칙은 다음과 같습니다.
- 제약조건을 직접 조작한 경우,
setNeedsLayout. - 오프셋 또는 smth와 같은 일부 조건을 변경한 경우 재정의된 제약 조건이 변경됩니다.
updateConstraintsmethod(제약을 변경하는 권장 방법, btw), 콜setNeedsUpdateConstraints, 그리고 대부분의 경우,setNeedsLayout그 후에. - 위의 작업 중 하나를 즉시 실행해야 하는 경우(레이아웃 패스 후 새로운 프레임 높이를 학습해야 하는 경우 등)에는
layoutIfNeeded.
그리고 당신의 애니메이션 코드에는setNeedsUpdateConstraints는 애니메이션 전에 제약조건이 수동으로 갱신되고 애니메이션은 오래된 것과 새로운 것의 차이에 따라 보기만 재작성하기 때문에 불필요합니다.
커버백에 의한 답변은 꽤 정확합니다.하지만 몇 가지 세부사항을 추가하고 싶습니다.
다음은 기타 동작을 설명하는 일반적인 UIView 사이클의 그림입니다.
- 제가 알아낸 바로는, 만약 제가
-setNeedsLayout-setNeedsUpdateConstraints하지만, 내가 , 그것은 기대대로 작동한다.-layoutIfNeeded-updateConstraintsIfNeeded애니메이션은 발생하지 않습니다.
updateConstraints이 해소될 뿐이며, 제약이 해소될 때까지는 적용되지 .layoutSubviews은 꼭 불러야 요.layoutSubviews
- setNeedsLayout 호출도 -updateControls 메서드
★★★★★★★★★★★★★★★★★★★★★★★★★★않은 는 UIView로 .updateConstraints.setNeedsUpdateConstraint공정의 제약 조건을 수정합니다.
「 」를 updateConstraints하다
[view setNeedsUpdateConstraints];
[view setNeedsLayout];
[view layoutIfNeeded];
언급URL : https://stackoverflow.com/questions/20609206/setneedslayout-vs-setneedsupdateconstraints-and-layoutifneeded-vs-updateconstra
'programing' 카테고리의 다른 글
| isKindOfClass와 isMemberOfClass의 iOS 차이점 (0) | 2023.04.22 |
|---|---|
| 컬럼(SQL Server 2008 R2)에 고유한 제약조건을 작성하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
| OleDB 및 Excel 혼합 데이터 유형: 데이터 누락 (0) | 2023.04.22 |
| Xcode 6 버그: Interface Builder 파일의 알 수 없는 클래스 (0) | 2023.04.22 |
| 정적 상수 문자열(클래스 멤버) (0) | 2023.04.22 |
