몇 가지 제약 조건을 통해 화면에 배치되는 UIView가 있습니다. 제약 중 일부는 수퍼 뷰가 소유하고 다른 제약은 다른 조상이 소유합니다 (예 : UIViewController의 뷰 속성).
이 모든 오래된 제약을 제거하고 새로운 제약을 사용하여 새로운 곳에 배치하고 싶습니다.
모든 단일 제약 조건에 대해 IBOutlet을 생성하지 않고 어떤 뷰가 해당 제약 조건을 소유하는지 기억하지 않고 어떻게이 작업을 수행 할 수 있습니까?
정교하게 설명하기 위해 순진한 접근 방식은 각 제약 조건에 대해 IBOutlet을 생성 한 다음 다음과 같은 코드를 호출하는 것입니다.
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
이 코드의 문제점은 가장 단순한 경우에도 2 개의 IBOutlet을 생성해야한다는 것입니다. 복잡한 레이아웃의 경우 필요한 IBOutlet 4 개 또는 8 개에 쉽게 도달 할 수 있습니다. 또한 제약 조건을 제거하라는 호출이 적절한 뷰에서 호출되는지 확인해야합니다. 예를 들어, 그는 상상 myViewsLeftConstraint
에 의해 소유된다 viewA
. 실수로을 호출 [self.view removeConstraint:self.myViewsLeftConstraint]
하면 아무 일도 일어나지 않습니다.
참고 : constraintsAffectingLayoutForAxis 메소드 는 유망 해 보이지만 디버깅 목적으로 만 사용됩니다.
업데이트 : 내가 받고있는 대부분의 답변 self.constraints
은 self.superview.constraints
, 또는 일부 변형을 처리합니다. 이러한 방법은 뷰에 영향을주는 제약 조건이 아닌 뷰가 소유 한 제약 조건 만 반환하므로 이러한 솔루션은 작동 하지 않습니다 .
이러한 솔루션의 문제를 명확히하려면 다음 뷰 계층 구조를 고려하십시오.
- 할아버지
- 아버지
- 나를
- 아들
- 딸
- 동료
- 나를
- 삼촌
- 아버지
이제 다음 제약 조건을 만들고 항상 가장 가까운 공통 조상에 연결한다고 상상해보십시오.
- C0 : 나 : 아들과 같은 탑 (나 소유)
- C1 : 나 : 너비 = 100 (내가 소유)
- C2 : 나 : 형제와 같은 키 (아버지 소유)
- C3 : 나 : 삼촌과 같은상의 (할아버지 소유)
- C4 : 나 : 할아버지와 같은 왼쪽 (Grandfather 소유)
- C5 : 형제 : 아버지와 같은 왼쪽 (아버지 소유)
- C6 : 삼촌 : 할아버지와 같은 왼쪽 (할아버지 소유)
- C7 : 아들 : 딸과 같은 왼쪽 (나 소유)
이제에 영향을 미치는 모든 제약을 제거하고 싶다고 상상해보십시오 Me
. 적절한 솔루션은 제거해야 [C0,C1,C2,C3,C4]
하며 다른 것은 없어야 합니다.
내가 self.constraints
(self가 Me 인 경우)를 사용 하면를 얻을 것입니다 [C0,C1,C7]
. 왜냐하면 그것들은 Me가 소유 한 유일한 제약이기 때문입니다. 이것이 누락 되었기 때문에 분명히 이것을 제거하는 것으로 충분하지 않을 것 [C2,C3,C4]
입니다. 또한 C7
불필요하게 제거 하고 있습니다.
self.superview.constraints
(self is Me)를 사용하면 [C2,C5]
아버지가 소유 한 제약이기 때문에 를 얻습니다 . 이후 분명히 우리는 이것들을 제거 할 수 C5
는 전혀 관련이있다 Me
.
내가 사용 grandfather.constraints
하면 얻을 것이다 [C3,C4,C6]
. 다시 말하지만,이 모든 것을 제거 할 수는 없습니다 C6
.
브 루트 포스 접근법 (자체 포함) 뷰의 각 선조의 위에 루프이고, 만약 볼 firstItem
또는 secondItem
뷰 자체이다; 그렇다면 해당 제약 조건을 제거하십시오. 이것은 올바른 솔루션으로 이어지고 [C0,C1,C2,C3,C4]
, 그리고 그 제약들만 반환 합니다.
그러나 전체 조상 목록을 반복하는 것보다 더 우아한 해결책이 있기를 바랍니다.