대답은 [view layoutIfNeeded]
입니다.
그 이유는 다음과 같습니다.
view.bounds.size.width
및 view.bounds.size.height
(또는을 사용하지 않는 한 동일한 프레임)을 검사하여 뷰의 현재 너비와 높이를 여전히 얻습니다 view.transform
.
원하는 것이 기존 제약 조건에 내포 된 너비와 높이 인 경우, 제약 조건을 수동으로 검사하지 않는 것이 정답입니다. 자동 레이아웃 시스템의 전체 제약 해결 논리를 다시 구현해야 해석 할 수 있기 때문입니다. 제약. 대신해야 할 일은 자동 레이아웃에 해당 레이아웃을 업데이트하도록 요청 하여 제약 조건을 해결하고 올바른 솔루션으로 view.bounds 값을 업데이트 한 다음 view.bounds를 검사하는 것입니다.
레이아웃 업데이트를 위해 자동 레이아웃을 어떻게 요청합니까? [view setNeedsLayout]
자동 레이아웃이 런 루프의 다음 턴에 레이아웃을 업데이트하도록하려면 호출 하십시오.
그러나 레이아웃을 즉시 업데이트하여 나중에 현재 함수 내에서 또는 실행 루프가 시작되기 전 다른 지점에서 새 경계 값에 즉시 액세스 할 수 있도록하려면[view setNeedsLayout]
및 을 호출해야합니다 [view layoutIfNeeded]
.
두 번째 질문 : "직접 참조가없는 경우 높이 / 너비 제약 조건을 어떻게 변경할 수 있습니까?"
IB에서 제약 조건을 생성하는 경우 최상의 솔루션은 뷰 컨트롤러 또는 뷰에 IBOutlet을 생성하여 직접 참조 할 수 있도록하는 것입니다. 코드에서 제약 조건을 만든 경우에는 만들 때 내부 약한 속성의 참조를 유지해야합니다. 다른 사람이 제약 조건을 생성 한 경우 뷰의 view.constraints 속성과 전체 뷰 계층 구조를 검사하고 중요한 NSLayoutConstraint를 찾는 논리를 구현하여이를 찾아야합니다. 이 질문에 대한 간단한 대답이 보장되지 않을 때 경계 크기를 결정한 특정 제약 조건을 효과적으로 결정해야하기 때문에 잘못된 방법 일 수 있습니다. 최종 경계 값은 여러 제약 조건의 매우 복잡한 시스템에 대한 솔루션이 될 수 있습니다.