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


109

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

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

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

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

답변:


118

제약 조건이 제거됩니다. 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];
    }
}

7
문서 어딘가에서이 사실을 찾을 수 있습니까? 나는 당신을 믿지만 사실이 어디에도 언급되지 않는 것이 이상합니다.
Sulthan

2
뷰와 함께 제약 조건이 제거된다는 것은 상식입니다. 그렇지 않다면 레이아웃 시스템이 향후 패스에서 어떻게 평가할 수 있을까요?
Mike Pollard 2013 년

6
이 대답은 분명한 것처럼 보이지만 여전히 엄청난 도움이되었습니다!
race_carr 2014 년

1
@pnollet, 나는 그 질문의 포스터가 왜 그가 한 일을했는지 ​​모르겠습니다. 나는 이것을 확인하기 위해 기록했고, 서브 뷰를 제거하고 수퍼 뷰에 대한 제약을 확인하면 제거 된 서브 뷰와 관련된 제약은 사라진다.
rdelmar 2014-04-22

4
@Firo, 나는 그들이 제거되어야한다고 확신하므로 iOS 6에 있지 않다면 아마도 버그 일 것입니다. BTW, removeFromSuperview 메서드에 대한 문서는 "이 메서드를 호출하면 제거 할 뷰를 참조하거나 제거중인 뷰의 하위 트리에있는 뷰를 참조하는 제약 조건이 제거됩니다"라고 말합니다.
rdelmar 2014-08-25

41

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

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

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

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


문서에서 바로 추가해 주셔서 감사합니다
Esko918

3

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

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

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


흥미 롭군요! 이 정보를 어디서 얻었습니까? addSubview에 대한 문서는이 동작을 언급하지 않습니다. 현재 뷰 컨트롤러를 제거 할 때 '뷰에 제약 조건을 설치할 수 없음'이라는 산발적 예외가 있기 때문에 요청하고 있습니다.
JimmyB

2

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

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


0

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


0

이 질문은 인터페이스 빌더로도 증명할 수 있습니다. 추가 제약 조건 UIView에 드래그 앤 드롭 한 ViewController다음 제거 UIView하면 파란색 제약 조건이 사라지는 것을 볼 수 있습니다.


4
Storyboard는 런타임 동작이 어떻게 발생하는지에 대해 아무것도 증명하지 않습니다. 스토리 보드는 원하는대로 할 수 있습니다!
mxcl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.