viewWillAppear:와 viewDidAppear 간의 프레임 변경 보기:
응용 프로그램에서 연결된 이상한 동작을 발견했습니다.IBOutlet내 보기 컨트롤러의 호출 사이에 연결된 보기 프레임이 있습니다.viewWillAppear:그리고.viewDidAppear:다음은 나의 관련 코드입니다.UIViewController하위 클래스:
-(void)viewWillAppear:(BOOL)animated {
NSLog(@"%@", self.scrollView);
}
-(void)viewDidAppear:(BOOL)animated {
NSLog(@"%@", self.scrollView);
}
로그 출력 결과:
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 44; 320 416); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
이는 두 통화 사이에서 프레임이 변화하고 있음을 분명히 보여줍니다.설정을 수행하기 위해 다음과 같은 작업을 수행했습니다.viewDidLoad방법, 하지만 화면에 표시될 때까지 내용을 변경할 수 없다면, 그것은 꽤 쓸모가 없어 보입니다.무슨 일이 일어날까요?
설명서에서 다음을 참조하십시오.
viewWillAppear:
뷰 컨트롤러의 뷰가 뷰 계층에 추가될 예정임을 알립니다.
viewDidAppear:
뷰 컨트롤러의 뷰가 뷰 계층에 추가되었음을 알립니다.
결과적으로 하위 뷰의 프레임은 아직 설정되지 않았습니다.viewWillAppear:
보기가 화면에 표시되기 전에 UI를 수정하는 적절한 방법은 다음과 같습니다.
viewDidLayoutSubviews
뷰 컨트롤러에 뷰가 하위 뷰를 방금 배치했음을 알립니다.
Autolayout우리의 관점의 GUI를 디자인하고 개발하는 방식에 큰 변화를 가져왔습니다.주요 차이점 중 하나는autolayout보기 크기가 즉시 변경되지는 않지만 트리거된 경우에만 특정 시간에 제약 조건을 재계산하거나 레이아웃의 "필요"로 표시할 수 있습니다.다음과 같이 작동합니다.-setNeedDisplay.
저에게 큰 도전은 우리가 더 이상 자동 크기 조정 마스크를 사용할 필요가 없다는 것을 이해하고 받아들이는 것이었고, 프레임은 우리의 관점을 배치하는 데 쓸모없는 속성이 되었습니다.우리는 더 이상 뷰 포지션에 대해 생각할 필요가 없지만, 서로 관련된 공간에서 그들을 어떻게 보고 싶은지 생각해야 합니다.
우리가 오래된 자동 크기 조정 마스크와 자동 레이아웃을 혼합하고 싶을 때 문제가 발생합니다.우리는 자동 레이아웃 구현에 대해 빨리 생각하고 자동 레이아웃을 기반으로 하는 뷰 계층 구조에서 기존 접근 방식을 혼합하지 않도록 해야 합니다.
뷰 컨트롤러의 기본 뷰와 같이 자동 크기 조정 마스크만 사용하는 컨테이너 뷰는 괜찮지만 혼합을 시도하지 않는 것이 좋습니다.
나는 스토리보드를 사용한 적이 없지만, 아마도 그것은 정확할 것입니다.자동 레이아웃을 사용하면 자동 레이아웃 엔진이 계산을 시작할 때 뷰 프레임이 설정됩니다.슈퍼 직후에 같은 것을 물어보십시오.- (void)viewDidLayoutSubviews보기 컨트롤러의 메서드입니다.
이 메서드는 자동 레이아웃 엔진이 뷰 프레임 계산을 완료한 경우에 호출됩니다.
불러
self.scrollView.layout필요한 경우()
의 신의에viewWillAppear방법.나중에 프레임에 액세스할 수 있으며 인쇄할 때와 동일한 값을 가집니다.viewDidAppear
저의 경우, 프레임 관련 메서드를 모두 다음으로 이동합니다.
override func viewWillLayoutSubviews()
완벽하게 작동했습니다(스토리보드에서 제약 조건을 수정하려고 했습니다).
언급URL : https://stackoverflow.com/questions/17637523/view-frame-changes-between-viewwillappear-and-viewdidappear
'programing' 카테고리의 다른 글
| maxscale(Galera 포함)은 기본 구성 요소/노드가 아닌 상태를 자동으로 처리합니까? (0) | 2023.08.20 |
|---|---|
| JQuery DataTable에서 기본적으로 모든 행을 표시하는 방법 (0) | 2023.08.20 |
| jQuery 선택기에 대한 다중 매개 변수? (0) | 2023.08.20 |
| 비주얼 스튜디오 코드에서 라라벨 블레이드 코드를 포맷하는 방법은 무엇입니까? (0) | 2023.08.15 |
| 그리드 간격 변경 및 눈금 레이블 지정 (0) | 2023.08.15 |