2016-06-08 13 views
1

UILabels, UIImages 등이 들어있는 사용자 정의 모달 뷰를 생성하고 모달 뷰로 나타납니다. 보기는 자동 레이아웃을 사용해야하며 프로그래밍 방식으로 수행해야하며 스토리 보드/xibs를 사용하지 않아야합니다 (불행히도).iOS Autolayout 비주얼 형식 - 간격을 설정하여 한 값을 시도하지만 작은 화면을 위해 다른 값으로 되돌리려면 어떻게 설정합니까?

모달보기는 화면의 가장자리 (위, 아래, 왼쪽, 오른쪽)에서 8 포인트가 될 때까지 내용과 함께 커집니다.

자식보기 간의 여백은 16 및 24 포인트입니다. 최신 iPhones 및 세로 모드에서는 위대하며 화면과 모달보기 사이에 충분한 공간을 남깁니다. 그러나 가로로 회전하면 모달 뷰가 위쪽/아래쪽 모서리에서 8pt 제한에 도달하고 많은 자식 뷰가 완전히 축소됩니다.

이 수정 프로그램은 하위 뷰 사이의 모든 "여백"을 8 포인트로 변경합니다. 이렇게하면 모든 것을 보여줄 수 있습니다.

내 목표는보기가 이미 높은 값 (예 : 16, 24)을 "시도"하지만 더 작은 값 (예 : 8)으로 "되돌아 갈"수 있도록 동적으로 여백을 조정할 수있게하는 것입니다. 화면을 채 웁니다.

하나의 방법은 여러 개의 제약 조건을 사용하는 것입니다. 방향이 변경되면이를 토글하는 것이지만 가능한 경우 해당 경로로 이동하고 싶지는 않습니다. 변경 사항이있을 때 시간이 지남에 따라 관리하기가 어려울 수 있습니다. 만든.

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-([email protected],[email protected])-[titleLabel]-[detailsLabel]-([email protected],[email protected])-[button(40)]-([email protected],[email protected])-|", options: [.AlignAllCenterX], metrics: metrics, views: views)) 

그러나이 항상 다시 '8 @ 900'값 많음이 경우에도 해당 될 다시이 사용 우선 순위 값과 같은 일을 할 수 있다고 그 동안

나는 하나의 재미있는 이야기 a를 발견했다 시야가 넓어 질 여지가 있습니다.

또한 아이 뷰의 일부에 대해 올바르게 작동하는 것 같다있는이 시도하지만, 그들 모두 없습니다 : 그것은 8로 다시 떨어지는되지

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,<=24)-[titleLabel]-[detailsLabel]-(>=8,<=24)-[button(40)]-(>=8,<=24)-|", options: [.AlignAllCenterX], metrics: metrics, views: views)) 

답변

3

, 8은보다 높은 우선 순위 제약 조건입니다 24 그러면 가능한 경우 그렇게 할 것입니다. 자동 레이아웃에서 1000은 필수로 간주됩니다 (즉, 상호 배타적 인 두 개의 우선 순위 제약 조건이 두 개있는 경우 로그에 일련의 오류가 표시됨). 반대로 우선 순위 0 - 999는 모두 선택 사항으로 간주됩니다. 선택 사항은 필요한 제약 조건을 충족시키기 위해 시스템에 의해 손상 될 수 있으며 기본적으로 0에서 999 사이의 값을 선택하여 파손되는 순서를 지정할 수 있습니다. 0은 먼저 부러진 것이고 999는 마지막에 끊어집니다. . 또한 다양한 시스템이 various priorities에서 발생한다는 사실에 주목할 가치가 있습니다.

작은 여백을 필요한 우선 순위 (1000)에서 부등식으로 만들고 큰 여백과 우선 순위 999에서 동등성을 지정하여 문제를 해결하는 방법을 고려해 볼 수 있습니다. 그런 식으로 24 포인트 값을 사용하려고 시도하지만 할 수 없다면 따라서 다른 필수 제약 조건을 유지하면서 8 포인트만큼 작게 만듭니다.

두 격차가 같은 비율로 줄어들지 않을 가능성이 있습니다. 그런 일이 일어나려면 슈퍼 뷰에 직접 고정 된 숨겨진 뷰 (숨겨진 뷰는 여전히 레이아웃에 영향을 미침)와 같은 까다로운 작업을해야 할 수도 있습니다. 또한 필요한 높이가> 8이고 레이블 높이가 24999입니다. . 그런 다음 두 개의 숨겨진 뷰를 서로 동등하게 제한 할 수 있습니다. iOS 9.x +를 지원할 수 있다면 UILayoutGuide을 대신 사용할 수 있습니다.

NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,[email protected])-[titleLabel]-[detailsLabel]-(>=8,[email protected])-[button(40)]-(>=8, [email protected])-|", options: [.AlignAllCenterX], metrics: metrics, views: views) 
+0

(> = 8,24 @ 999) 모든 문제에 대해 해결했습니다. 어떤 숨겨진 견해도 필요없이 완벽하게 작동합니다. 감사!! – JimmyJammed

0

크기 클래스가 변경 될 때 제약 조건을 조정한다고 생각합니다. 여러 개의 제약 조건을 갖는 대신 크기 클래스가 변경 될 때 상수를 16에서 8로 조정하십시오.

if (self.view.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) 
    // set constraints which implement margins to constant of 8 
else 
    // set constraints which implement margins to constant of 16 

자세한 정보 here.