Priority는 우선순위를 정하는 속성입니다.
1000~1 사이의 숫자로 우선순위를 정하며, 1000은 필수제약을 의미하고 나머지 작은 값들은 옵션제약을 의미합니다.
항상 우선순위가 높은 제약이 먼저 적용되고,
서로 충돌하는 제약이 같은 우선순위를 가지고 있으면, 제약오류가 발생됩니다.
Center X, Y 제약과 Width=240, Height=128 제약이 추가된 View를 하나 만들겠습니다.
이어서 다시 View에 대해 100의 Width 제약을 추가하겠습니다.
Greate Than or Equal의 제약으로 추가된것을 확인할 수 있습니다.
이는 X-code에서 제약충돌을 방지하기 위해 두 번째 만든 Width제약의 릴레이션을 Greate Than or Equal로 설정한 것입니다.
그럼 100의 Width 제약을 Equal로 바꾸면 어떻게 되는지 보겠습니다.
제약 충돌로 인해 오류가 발생하게됩니다.
오류를 해결하기 위해 100의 Width 제약의 Priority를 바꾸어보겠습니다.
오류가 해결되며 원래 설정한 너비로 돌아오게됩니다.
이는 제약의 우선순위를 통해 프레임 계산에 사용되는 제약 선택을 확실하게 판단했기 때문입니다.
또한 Document Outline을 통해 Width=100의 제약이 사라진것이 아닌 " @999 " 로 우선순위를 나타내며
남아있는 것을 볼 수 있습니다.
이번에는 코드를 통해 Priority를 설정해보겠습니다.
먼저, 클릭하면 우선순위 값이 바뀌는 버튼을 하나 만들겠습니다.
그리고 Width 와 관련된 두 제약과 Button을 드래그앤드롭해주겠습니다.
그리고 우선 순위를 비교하고 값을 넣는 코드를 작성하는데 오류가 발생합니다.
이는 Priority의 자료형이 정수가 아닌 UI Layout priority 구조체이기 때문입니다.
오류를 해결하기 위해선, 우선순위를 생성자로 전달해서 UI Layout priority 인스턴스를 만들고
인스턴스를 Priority 변수에 할당해야합니다.
-
코드를 재작성했습니다.
시뮬레이터를 통해 결과를 보려고 하는데 실행은 잘 되지만, 이번에는 디버그 부분에서 오류가 발생합니다.
이는 필수제약을 옵션제약으로 변경하거나 반대의 경우는 지원하지 않는다고 나타나는데
코드를 통해 우선순위를 동적으로 변경할 때에는 이런 오류를 피하기 위해서 1000 이하의 우선순위 값을 사용합니다.
Width1을 선택하여 우선순위를 999에서 800으로 바꾸겠습니다.
그리고 코드의 1000을 999로 바꾸겠습니다.
다시 시뮬레이터를 통해 결과를 확인해보겠습니다.
디버그 오류 메세지 없이 시뮬레이터가 실행되며, 버튼 클릭에 따라 우선순위가 변경되고 UI가 업데이트 됩니다.
이 패턴을 통해 조건에 따라 동적으로 업데이트되는 다양한 UI를 기술적으로 사용할 수 있습니다.
정리
-
attribute Instpector에서는 정수로 우선순위를 지정하지만.
코드로 지정할땐UI Layout priority 구조체로 지정해야합니다.
-
다음은 UILayoutPriority의 Extenstion 부분 입니다.
4개의 타입속성으로 이루어져있는데, 대부분의 경우 4개의 속성 중 하나의 속성을 사용해 우선순위를 지정합니다.
속성을 통해 원하는 우선순위를 구현할 수 없을 때는 원하는 정수값으로 우선순위를 지정합니다.
1, required : 정수로 환산하면 1000인 우선순위 (필수제약에서 사용)
2, defaultHigh : 정수로 환산하면 750인 우선순위
3, defaultLow : 정수로 환산하면 250인 우선순위
4, fittingSizeLevel : 정수로 환산하면 50인 우선순위 (직접 우선순위를 지정할 땐 잘 사용하지 않음.)
내용출처 = https://www.youtube.com/watch?v=vDm71KDkMFE
'2022_iOS 앱 개발자 워크숍 > 2, Auto Layout' 카테고리의 다른 글
Auto Layout : 개인 프로젝트에 적용해보기 (0) | 2022.01.17 |
---|---|
Auto Layout : Constant (0) | 2022.01.14 |
Auto Layout : Multiplier (0) | 2022.01.14 |
Auto Layout : 관계 설정 (0) | 2022.01.14 |
Auto Layout : Width, Height 제약 추가 (0) | 2022.01.13 |
댓글