programing

setNeedsLayout vs. setNeedsUpdateConstraints 및 레이아웃IfNeeded vs updateConstraints필요한 경우

lastcode 2023. 4. 22. 09:31
반응형

setNeedsLayout vs. setNeedsUpdateConstraints 및 레이아웃IfNeeded vs updateConstraints필요한 경우

자동차 레이아웃 체인은 기본적으로 3개의 다른 프로세스로 구성되어 있는 것으로 알고 있습니다.

  1. 업데이트, 제약 조건
  2. 레이아웃 뷰(여기서 프레임 계산을 얻을 수 있습니다.
  3. 표시

알 수것은 입니다.-setNeedsLayout ★★★★★★★★★★★★★★★★★」-setNeedsUpdateConstraints Apple 문서:

set Needs Layout

보기의 하위 보기 레이아웃을 조정하려면 응용프로그램의 기본 스레드에서 이 메서드를 호출하십시오.이 메서드는 요청을 기록하고 즉시 반환합니다.이 방법은 즉시 업데이트를 강제하지 않고 다음 업데이트 주기를 대기하기 때문에 보기를 업데이트하기 전에 여러 보기의 레이아웃을 비활성화할 수 있습니다.이 동작을 통해 모든 레이아웃 업데이트를 하나의 업데이트 주기에 통합할 수 있으며, 이는 일반적으로 성능을 향상시킵니다.

set Needs Update Constraints

커스텀 뷰의 속성이 제약조건에 영향을 주는 방법으로 변경되면 이 메서드를 호출하여 향후 어느 시점에서 제약조건을 갱신할 필요가 있음을 나타낼 수 있습니다.그런 다음 시스템은 일반 레이아웃 경로의 일부로 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의 장래의 을 확인합니다.layoutIfNeededlayoutSubviews.

언제layoutSubviews호출됩니다.또,updateConstraintsIfNeeded그래서 제 경험상 수동으로 전화할 필요가 거의 없습니다.사실 레이아웃을 디버깅할 때 이외에는 호출한 적이 없습니다.

다음을 사용하여 제약 조건 업데이트setNeedsUpdateConstraints꽤 드문 일이기도 해, objc.io – a a autolayout – :::에 대해 읽어보아야 합니다.

나중에 변경되어 제약조건 중 하나가 무효가 되었을 경우 즉시 제약조건을 삭제하고 setNeedsUpdateConstraints를 호출해야 합니다.실제로 제약조건 업데이트 패스를 트리거해야 하는 유일한 경우입니다.

게다가 제 경험상, 저는 제약조건을 무효로 하거나setNeedsLayout새로운 제약조건이 새로운 레이아웃을 요구하기 때문에 코드의 다음 행에 표시됩니다.

경험의 법칙은 다음과 같습니다.

  • 제약조건을 직접 조작한 경우,setNeedsLayout.
  • 오프셋 또는 smth와 같은 일부 조건을 변경한 경우 재정의된 제약 조건이 변경됩니다.updateConstraintsmethod(제약을 변경하는 권장 방법, btw), 콜setNeedsUpdateConstraints, 그리고 대부분의 경우,setNeedsLayout그 후에.
  • 위의 작업 중 하나를 즉시 실행해야 하는 경우(레이아웃 패스 후 새로운 프레임 높이를 학습해야 하는 경우 등)에는layoutIfNeeded.

그리고 당신의 애니메이션 코드에는setNeedsUpdateConstraints는 애니메이션 전에 제약조건이 수동으로 갱신되고 애니메이션은 오래된 것과 새로운 것의 차이에 따라 보기만 재작성하기 때문에 불필요합니다.

커버백에 의한 답변은 꽤 정확합니다.하지만 몇 가지 세부사항을 추가하고 싶습니다.

다음은 기타 동작을 설명하는 일반적인 UIView 사이클의 그림입니다.

UIView의 라이프 사이클

  1. 제가 알아낸 바로는, 만약 제가-setNeedsLayout-setNeedsUpdateConstraints하지만, 내가 , 그것은 기대대로 작동한다.-layoutIfNeeded-updateConstraintsIfNeeded애니메이션은 발생하지 않습니다.

updateConstraints이 해소될 뿐이며, 제약이 해소될 때까지는 적용되지 .layoutSubviews은 꼭 불러야 .layoutSubviews

  1. 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

반응형