AutoLayout 구속 전환

3778 단어 AutoLayoutSwiftiOS
NSLayoutAnchor는 NSLayoutConstraint를 사용하여 레이아웃 제약을 만드는 것보다 간단하고 이해하기 쉬운 iOS9에 나타납니다.
그럼에도 불구하고 여러 개의 부품으로 구성된 화면을 만들면 번거로워지기 때문에 스토리보드에서 제약을 설정하는 경우가 많다.
많은 경우 Storyboard에서 AutoLayout의 제약을 설정하고 끝내는 경우가 많았지만 이번에는 화면을 만들 때 TableView의 각 셀에 대한 제약을 변경하는 장면이 나왔기 때문에 Storyboard의 제약을 최대한 사용하고 필요한 곳에서만 원본 코드의 AutoLayout을 전환했습니다.나는 그 내용을 총결하고 싶다.

환경


Xcode10.2(Swift5.0) 환경에서 요약합니다.

1. 화면 구성


다음 화면을 바탕으로 자동 레이아웃 제약의 전환을 설명합니다.
화면 이미지

화면은 TableView에서 만들어지지만 셀에 따라 레이아웃 정보가 있습니다. 제목은 왼쪽 아래에 있을 때도 있고 중앙에 있을 때도 있습니다.
NSLayoutAnchor에서 아래 제약조건 (bottomAnchor 설정) 과 중간 제약조건 (centerYanchor 설정) 을 전환하여 제목 왼쪽 아래/중간 위치 사이에서 수직 위치의 AutoLayout 제약조건을 전환할 수 있습니다.
(화면의 제목은 왼쪽 아래와 중앙에서 글꼴 크기와 정렬을 변경하여 설명을 생략합니다.)

2. Storyboard의 설정


우선, 나는 원본 코드로 판면 디자인 정보에 따라 제목 위치의 왼쪽 아래와 중앙의 제약에 따라 전환하고 싶다.다만, AutoLayout의 제약은 평소에 Storyboard로 설정하는 것이 익숙하지 않아서 원본 코드로 쓰는 것이 익숙하지 않다. 앞으로 레이아웃 정보가 증가하고 제목의 위치가 추가되는 상황에서 좀 번거롭다. 갑자기 Storyboard로 제약을 만들려고 하면 전환할 수 없다.
그리고 여러 가지 조사를 실시했다. Storyboard의 제약 설정에 installed라는 항목(아래 화면 이미지 오른쪽 빨간색 테두리 참조)이 있다. 적용하고 싶은 제약 몇 개를 만들었다. 이 installed 항목만 검사하고 제약 하나만 활성화시킨다.다른 제약조건은 비활성 상태일 수 있습니다.(여러 제약조건이 충돌할 수 있으므로 하나의 제약조건만 활성화합니다.)

비활성 상태의 구속은 화면 이미지의 왼쪽에 있는 빨간색 상자처럼 아이콘 색상을 옅게 합니다.

3. 소스 코드에서 구속 전환


Storyboard에서 AutoLayout 구속조건을 만들면 레이아웃 정보에 따라 소스 코드에서 구속조건을 전환합니다.
다음은 예시 코드입니다.

    @IBOutlet weak var stackViewBottomConstraint: NSLayoutConstraint!
    @IBOutlet weak var stackViewCenterYConstraint: NSLayoutConstraint!

    // (途中省略) //

    func updateTitlePosition() {
        // タイトルとリンクボタンの表示位置
        switch position {
        case .center:
            stackViewBottomConstraint.isActive = false
            stackViewCenterYConstraint.isActive = true
        case .bottomLeft:
            stackViewCenterYConstraint.isActive = false
            stackViewBottomConstraint.isActive = true
        }
    }
생성된 구속조건을 IBOutlet의 구속 속성에 연결합니다.updateTitlePosition의 방법 내 레이아웃 정보(position)에 따라 isActive 속성에서 활동과 비활동을 전환함으로써 제목의 위치를 변경합니다.
이렇게 하면 약간 복잡한 제약 설정은 Storyboard로 설정하고 전환 자체는 원본 코드로 기재할 수 있기 때문에 간단하게 진행할 수 있다고 생각합니다.

좋은 웹페이지 즐겨찾기