programing

layoutSubviews는 언제 호출됩니까?

abcjava 2023. 5. 31. 14:03
반응형

layoutSubviews는 언제 호출됩니까?

사용자 지정 보기가 있지만 사용자 지정 보기가져 있지 않습니다.layoutSubview메시지를 표시합니다.

화면을 가득 채우는 보기가 있습니다.화면 하단에는 탐색 모음의 높이를 변경하면 인터페이스 작성기에서 크기가 올바르게 조정되는 사용자 지정 하위 보기가 있습니다. layoutSubviews보기가 생성될 때 호출되지만 다시는 호출되지 않습니다.제 의견은 정확하게 정리되어 있습니다.통화 중 상태 표시줄을 해제하면 하위 보기가layoutSubviews기본 보기의 크기를 애니메이션화하더라도 이 호출되지 않습니다.

에서?layoutSubviews실제로 전화를 걸었습니까?

있습니다autoresizesSubviews로 설정한.NO가▁and엔. 그리고 가 설정되어 그리고 Interface Builder에서는 위쪽과 아래쪽 스트럿과 수직 화살표 세트가 있습니다.


퍼즐의 또 다른 부분은 창을 키로 만들어야 한다는 것입니다.

[window makeKeyAndVisible];

그렇지 않으면 하위 보기의 크기가 자동으로 조정되지 않습니다.

비슷한 질문이 있었지만 답변(또는 인터넷에서 찾을 수 있는 답변)에 만족하지 못했기 때문에 실제로 시도해 본 결과 다음과 같습니다.

  • init 유발하지 않습니다.layoutSubviews ▁(du (duh)
  • addSubview: 인들원layoutSubviews뷰) 및 뷰에 됩니다.
  • 다보setFrame현명한 요구.layoutSubviews
  • UIScroll이 합니다.layoutSubviews및 됩니다.
  • 호출만 호출하는 장치 회전layoutSubview상위 보기(응답 보기컨트롤러 기본 보기)
  • 하면 보기크조호출정기호출▁call라고 합니다.layoutSubviews 해당 항목의 수퍼뷰에서 (중요: 크기를 결정하는 콘텐츠가 변경되면 고유한 콘텐츠 크기를 가진 뷰가 크기를 조정합니다. 를 들어, UILabel의 텍스트를 업데이트하면 고유한 콘텐츠 크기가 업데이트되어 해당 항목의 슈퍼뷰가 호출됩니다.)

내 결과 - http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/

@BadPirate의 이전 답변을 바탕으로 조금 더 실험을 해보고 몇 가지 설명/수정 사항을 제시했습니다.나는 그것을 발견했습니다.layoutSubviews:다음과 같은 경우에만 보기에서 호출됩니다.

  • 프레임이 아닌 자체 경계가 변경되었습니다.
  • 직접 하위 뷰 중 하나의 경계가 변경되었습니다.
  • 하위 보기가 보기에 추가되거나 보기에서 제거됩니다.

관련 세부 정보:

  • 한계는 다른 원점을 포함하여 새 값이 다른 경우에만 변경된 것으로 간주됩니다.특히 그것이 이유입니다.layoutSubviews:UIScrollView는 경계의 원점을 변경하여 스크롤을 수행하므로 스크롤할 때마다 호출됩니다.
  • 프레임을 변경하면 크기가 변경된 경우에만 경계가 변경됩니다. 이는 경계 속성에 전파되는 유일한 항목이기 때문입니다.
  • 뷰 계층 구조에 아직 포함되지 않은 뷰 경계를 변경하면 다음과 같은 호출이 발생합니다.layoutSubviews: 보기가 보기 계층에 추가되는 경우.
  • 그리고 완전성을 위해: 이러한 트리거는 layoutSubviews를 직접 호출하지 않고 호출합니다.setNeedsLayout깃발을 게양하는 것.실행 루프가 반복될 때마다 보기 계층의 모든 보기에 대해 이 플래그가 선택됩니다.플래그가 올라간 상태로 발견되는 각 뷰에 대해,layoutSubviews:호출되고 플래그가 재설정됩니다.상위 계층의 보기가 먼저 확인/호출됩니다.

https://developer.apple.com/library/prerelease/tvos/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html #//apple_ref/doc/uid/TP40009503-CH5-SW1

레이아웃 변경은 보기에서 다음 이벤트가 발생할 때마다 발생할 수 있습니다.

뷰의 경계 사각형 크기가 변경됩니다.
인터페이스 방향 변경이 발생하며, 이로 인해 일반적으로 루트 뷰의 경계 사각형이 변경됩니다.
뷰의 도면층과 연관된 핵심 애니메이션 하위 도면층 집합이 변경되므로 레이아웃이 필요합니다.
응용 프로그램이 강제로 레이아웃을 호출합니다.setNeedsLayout또는layoutIfNeeded견해의 방법
응용 프로그램이 다음을 호출하여 레이아웃을 강제 적용합니다.setNeedsLayout뷰의 기본 도면층 객체의 메서드입니다.

BadPirate의 답변 중 일부는 부분적으로만 사실입니다.

  1. 위해서addSubView 포트점

    addSubview뷰뷰) 및layout의 합니다.

    보기(대상 보기)의 자동 크기 마스크에 따라 다릅니다.ON인 각 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "addSubview자동 크기 마스크가 없는 경우 layoutSubview는 뷰(대상 뷰) 프레임 크기가 변경될 때만 호출됩니다.

    방식으로(자동 ), 되지 않는 됩니다. : UIView는 UIView 프레임이 매번 변경되지 않을 때입니다.addSubview.

    이 기술을 통해 애플리케이션의 성능도 향상됩니다.

  2. 장치 회전 지점의 경우

    장치 회전은 레이아웃만 호출합니다. 상위 보기의 하위 보기(응답하는 컨트롤러의 기본 보기)

    에 있는 에만 해당될 수 있습니다(root at VC root VC 계 VC 층는만루해당있다니습수위될치에우트가경있에루(▁this:다위치니▁your▁only:window.rootViewController), 인 경우입니다.), 예를 들어, "예를 들어"라고 합니다.되지 않은 회전할 때이 알림도 .OS 5에서 VC를 만들었지만 다른 VC에 추가되지 않은 경우 장치가 회전할 때 이 VC는 아무런 알림도 받지 않습니다.따라서 layoutSubviews를 호출해도 보기가 인식되지 않습니다.

시뮬레이션 화면 요소(상태 표시줄 등)가 설정된 뷰에서는 스프링을 변경할 수 없다는 Interface Builder의 주장에 따라 솔루션을 추적했습니다.스프링이 기본 뷰에 대해 꺼져 있었기 때문에 해당 뷰는 크기를 변경할 수 없으므로 호출 표시줄이 나타나면 전체적으로 아래로 스크롤됩니다.

시뮬레이션 기능을 끈 다음 보기 크기를 조정하고 스프링을 올바르게 설정하면 애니메이션이 발생하고 내 메서드가 호출됩니다.

이것을 디버깅할 때 추가적인 문제는 메뉴를 통해 통화 중 상태가 전환될 때 시뮬레이터가 앱을 종료한다는 것입니다.앱 종료 = 디버거 없음.

[self.view setNeedsLayout];에서 viewDidLayoutSubview를 합니다.

레이아웃IfNeeded를 살펴보셨습니까?

설명서 코드 조각은 다음과 같습니다.애니메이션 진행 중에 이 메소드를 명시적으로 호출하면 애니메이션이 작동합니까?

layoutIfNeeded 필요한 경우 하위 보기를 레이아웃합니다.

- (void)layoutIfNeeded

토론 이 방법을 사용하여 도면을 그리기 전에 하위 뷰의 레이아웃을 강제로 지정합니다.

iPhone OS 2.0 이상에서 사용할 수 있습니다.

OpenGL 앱을 SDK 3에서 4로 마이그레이션할 때 layoutSubviews가 더 이상 호출되지 않았습니다.많은 시행착오 끝에 마침내 MainWindow.xib를 열고 Window 개체를 선택한 다음 검사자에서 Window Attributes 탭(맨 왼쪽)을 선택하고 "Visib at launch"를 선택했습니다.SDK 3에서는 여전히 layoutSubViews 호출을 발생시키는 데 사용된 것으로 보이지만 4에서는 발생하지 않습니다.

6시간 동안의 좌절감이 끝이 났습니다.

언급URL : https://stackoverflow.com/questions/728372/when-is-layoutsubviews-called

반응형