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와 같은 일부 조건을 변경한 경우 재정의된 제약 조건이 변경됩니다.
updateConstraints
method(제약을 변경하는 권장 방법, 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 |