code

뷰가 제거되면 제약 조건이 어떻게 되나요?

codestyles 2020. 8. 13. 23:24
반응형

뷰가 제거되면 제약 조건이 어떻게 되나요?


내가 가진 질문은 간단하지만 문서에서 정보를 찾을 수 없습니다.

뷰 계층 구조에서 뷰를 제거하거나 다른 뷰로 이동하면 레이아웃 제약 조건은 어떻게됩니까?

예를 들어, C하위 뷰 AB. 컨테이너 C에는 몇 가지 제약이 있습니다. 그런 다음 [A removeFromSuperview]. 제약 조건은 어떻게됩니까 A?

다시 추가 A하면 C어떻게 되나요?


제약이 제거됩니다. A를 다시 추가하는 경우 새 제약 조건을 만들어야합니다. 또는 A를 제거하기 전에 제약 조건을 저장하면 다시 추가 할 수 있습니다. 이와 같은 작업을 수행 할 때 view1이라는 뷰에 대해 다음과 같은 제약 조건을 저장합니다.

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

이 질문도 있었기 때문에 Apple Docs에서 킥을 확인했으며 제약 조건이 제거되었음을 문서화했습니다.

문서 UIView의 removeFromSuperview 방법 상태에 대한 :

이 메서드를 호출하면 제거 할 뷰를 참조하거나 제거 할 뷰의 하위 트리에있는 뷰를 참조하는 제약 조건이 제거됩니다.

작년에 원래 질문이 게시되었을 때 이것이 문서화되었는지 확실하지 않지만 누군가가 필요할 경우를 대비하여이 정보를 공유 할 것이라고 생각했습니다 ...


그러나 두 개의 독립적 인 상위 뷰 A와 B와 하위 뷰 C가있는 경우 (C는 현재 A의 하위 뷰이며 적절한 제약 조건이있는 경우) [B addSubview : C]를 호출하면 A와 관련된 제약 조건이 지워지지 않습니다. 및 C, 자동 레이아웃이 예외를 발생시키기 시작합니다. 이러한 제약 조건은 더 이상 동일한 계층 구조의 뷰와 관련이 없기 때문입니다.

B에 C를 추가하기 전에 제약 조건을 제거하려면 [C removeFromSuperview]를 명시 적으로 호출해야합니다.

Mac OS X에서도 마찬가지입니다. iOS를 확인하지 않았습니다.


제약 조건은 다음과 같은 경우에도 제거됩니다. [A removeFromSuperview]

그들은 잊혀지고 A를 C에 다시 추가하면 제약이 추가되지 않습니다.


그것들도 제거되어 간단한 테스트를 할 수 있습니다. 뷰 SUBVIEW를 선택하고 SUBVIEW를 제한하는 costraint를 생성하여 superview 크기 조정을 따릅니다 (예 : superview 가장자리에 부착 됨). 이를 위해이 CONTAINERVIEW에 하위 뷰로 SUBVIEW를 추가하고 다음과 같은 제약 조건으로 추가합니다.
V : |-[SUBVIEW]-|
H : |-[SUBVIEW]-|
이러한 제약은 SUBVIEW superview에 추가되어야합니다. 따라서 CONTAINERVIEW가 필요합니다.
모든 CONTAINERVIEW 제약 조건을 확인하여 SUBVIEW를 제거하면 두 개가 더 이상 주변에 없다는 것을 알 수 있습니다.


이 질문은 인터페이스 빌더로도 증명할 수 있습니다. 추가 제약 조건 UIViewa 끌어다 놓은 ViewController다음을 제거 UIView하면 파란색 제약 조건이 사라지는 것을 볼 수 있습니다.

참고 URL : https://stackoverflow.com/questions/18617991/what-happens-with-constraints-when-a-view-is-removed

반응형