2014-11-13 3 views
1

에 오버라이드합니다. 4 개의 버튼과 해당 레이블이있는 UIView가 있습니다. 그것들은 현재 뷰의 중앙에 위치하고 중간에있는 버튼은 적절한 후행 및 선행 공간 제약을 필요로하므로 정의 된 공간이 항상 그들 사이에 있습니다.iOS - 코드에서 Interface Builder로 작성된 후미 및 선행 공백 제한을

그러나 버튼 중 하나가 숨겨져 있고 (항상 한 번에 두 개의 중간 버튼 중 하나가 숨겨져있을 때만) 버튼을 다시 중심에 배치해야합니다. 인터페이스 빌더를 사용하지 않고서도 후행 및 선행 공백과 관련된 제약 조건을 삭제하는 것 같습니다. 이후 서브 뷰에 대한 제약 조건을 가질 수 없기 때문에 버튼의 모든 제약 조건을 무시하고 싶습니다 (폭 및 높이 제외). 후행 (및/또는) 선행 공백과 관련된 단추 자체의). 비주얼 이미지없이 일례로서

-----> B ----> ----- C> D

사람들은 아래 라벨 내 네 개의 버튼 (아르 물론 보이지는 않음) 사이에 4 개의 공백이 있습니다 (그러나 모두 가운데에있는보기). B가 숨겨져 있다면보기에서 A, C 및 D를 다시 센터 싶지만 이제는 원래 설정에 대한 후행 및 선행 공백이 오래되었고이 예제에 따라 다시 설정해야합니다. C가 숨겨져 있다면 A, B 및 D에 대한 제약 조건을 다시 센터링하고 재설정해야합니다. 여기서 A와 D가 같은 간격 (4 칸)으로 양쪽에 A와 D의 뷰 가운데에 있어야합니다.

이와 같은 코드에서 이러한 제약 조건을 무시할 수있는 방법이 있습니까? 그곳에는 XCode에서 조건부 제약 조건을 설정하는 방법이있는 것 같지만 (물론 멋지 겠지만) 하위 뷰에서 제약 조건을 제거하여 코드에서 모두 만들 수는 없습니다.

이 솔루션은 iOS 7 & 8을 지원해야하며 화면의 다른보기에서 다른 요소가 제약 조건을 사용하기 때문에 자동 레이아웃을 끌 수 없습니다.

의견이 있으십니까? 아이디어?

답변

0

직선적 인 방법은 제약 조건을 다시 실행하는 것입니다.

그런데 숨겨진 버튼을 다시 표시해야합니까? 그렇지 않다면 볼 수있는 쉬운 방법은 하나의 버튼이 숨겨져있을 때 우선 순위가 낮은 제약 조건을 추가하는 것입니다. 숨기고 싶은 버튼을 숨기는 대신 슈퍼 뷰에서 모두 제거하십시오.

버튼 B를 숨길 수 있다면 B의 압축 저항 우선 순위보다 낮은 우선 순위로 A와 C 사이에 수평 간격 제한을 추가하고 B가 숨겨져있을 때 A와 C 사이의 올바른 간격 인 상수를 추가하십시오. B를 숨기려면 슈퍼 뷰에서 제거하고 (효과적으로 그것에 관련된 제약 조건 제거) 우선 순위가 낮은 제약 조건을 적용해야합니다.

+0

예 버튼을 다시 표시 할 수 있습니다. 버튼 B는 A, C, D 센터가있는 곳에서 숨길 수 있습니다. 그런 다음에 물건이 많으면 C를 숨겨야하고 B를 표시합니다. 그러면 A, B, D가 가운데에 있어야합니다. 업데이트 된 제약 조건. – cspam

+0

그런 다음 몇 가지 방법으로 제약 조건을 다시 실행해야합니다. 그러나 위의 방법을 사용하면 버튼 B에 대한 강력한 참조와 관련한 제약 조건을 적용 할 수 있습니다. 그런 다음 숨기고 자 할 때 수퍼 뷰에서 여전히 제거하고, 표시하고자 할 때 버튼 B와 구속 조건을 추가하십시오. 나는 사실 내 대답에 슈퍼 뷰를 중심으로 버튼을 유지하는 것을 고려하지 않았다. 대답은 단지 버튼 사이의 거리를 유지하는 것이 었습니다. 지금 네 명이 볼 수있을 때 어떻게 그들을 중심에 두겠습니까? – riadhluke

+0

기본적으로 시행 착오와 버튼 중심을 볼 때까지 수동으로 이동 한 다음 IB에서 일치하도록 구속 조건을 변경합니다. 센터는 실제로 A ----> B ----> C ----> D가 설정된 상태에서 버튼 B와 버튼 C 사이의 중간 지점입니다. A와 D는 모두 superview에 대한 선행 공백을 가지고 있지만 버튼 A는 어느 것이 숨겨져 있는지에 따라 B 또는 C로부터 일정한 간격을 가져야하므로 (즉, 선행 공간이 동적으로 변경되어야 함을 의미 함) 버튼 D에 대해서도 똑같은 일을해야합니다. 모든 제약 조건을 코드에 작성해야 할 수도 있습니다. – cspam

관련 문제