코드를 사용하여 AutoLayout Tomes 구현

13610 단어 AutoLayoutXcodeiOS
환경
Xcode8.2
Swift3

하고 싶은 일


가로로 배열된 객체의 표시 숨기기를 전환하고 숨겨진 객체를 채워 표시합니다.
참고 문헌: 익숙한 AutoLayout 책

예를 들어, 위의 스크린 스냅샷 HogeButton 을 숨기면 아래 설명된 스크린 스냅샷 처럼 HogeButton 을 숨기고 UIButton이 있는 공간을 채워 표시합니다.

실패 예


숨기기만 가짜로 설정하면 대상은 숨겨지지만 공간은 있습니다.

UIButton.isHidden =  true


제약조건 추가


Intrinsic size에서 지정한 너비를 0으로 설정하는 제약조건을 추가합니다.


너비 0의 제약조건을 정의하고 숨길 때 제약조건을 추가합니다.표시할 때 제약조건을 삭제합니다.
        // ボタンの横幅を0にする制約
     let buttonWidthConstraint = NSLayoutConstraint(
            item: self.button
            , attribute: NSLayoutAttribute.width
            , relatedBy: NSLayoutRelation.equal
            , toItem: nil
            , attribute: NSLayoutAttribute.width
            , multiplier: 1.0
            , constant: 0)

IBOutlet을 사용하여 객체 간의 너비 구속조건 연결하기


구속 조건을 스토리보드에서 파일로 드래그합니다.

IBOutlet으로 연결할 수 있으면 다음과 같이 파일에 코드가 생성됩니다.얘 이름buttonLeadingConstraint

숨길 때 제약조건 변경

        if button.isHidden {
            // IBOutletで接続した制約
            buttonLeadingConstraint.constant = 8
            // 制約を削除する
            NSLayoutConstraint.deactivate([buttonWidthConstraint])
            button.isHidden = false
        }
        else {
            buttonLeadingConstraint.constant = 0
            // 制約を追加する
            NSLayoutConstraint.activate([buttonWidthConstraint])
            button.isHidden = true
        }
    }

총결산


숨기고 표시하는 시기에 제약을 변경함으로써 예상한 동작을 실현했다.
만약 이런 더 좋은 방법이 있다면 나에게 알려주시오
//
//  ViewController.swift
//  IntrinsicTorutsumeSample
//
//  Created by { Kazunori } on 2017/02/02.
//  Copyright © 2017年 Yamamoto Kazunori. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var switchButton: UISwitch!

    @IBOutlet weak var buttonLeadingConstraint: NSLayoutConstraint!
    @IBOutlet weak var labelLeadingConstraint: NSLayoutConstraint!
    @IBOutlet weak var switchLeadingConstraint: NSLayoutConstraint!
    @IBOutlet weak var switchWidthConstraint: NSLayoutConstraint!

    var buttonWidthConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        // ボタンの横幅を0にする制約
        buttonWidthConstraint = NSLayoutConstraint(
            item: self.button
            , attribute: NSLayoutAttribute.width
            , relatedBy: NSLayoutRelation.equal
            , toItem: nil
            , attribute: NSLayoutAttribute.width
            , multiplier: 1.0
            , constant: 0)
    }

    @IBAction func pressToolbarLabel(_ sender: Any) {
        if label.text == nil {
            label.text = "HogeGehoString"
            labelLeadingConstraint.constant = 8
        }
        else {
            label.isHighlighted = true
            label.text = nil
            labelLeadingConstraint.constant = 0
        }
    }

    @IBAction func pressToolbarButton(_ sender: Any) {
        if button.isHidden {
            buttonLeadingConstraint.constant = 8
            NSLayoutConstraint.deactivate([buttonWidthConstraint])
            button.isHidden = false
        }
        else {
            buttonLeadingConstraint.constant = 0
            NSLayoutConstraint.activate([buttonWidthConstraint])
            button.isHidden = true
        }
    }

    @IBAction func pressToolbarSwitch(_ sender: Any) {
        if switchButton.isHidden {
            switchLeadingConstraint.constant = 8
            switchWidthConstraint.constant = 49
            switchButton.isHidden = false
        }
        else {
            switchLeadingConstraint.constant = 0
            switchWidthConstraint.constant = 0
            switchButton.isHidden = true
        }
    }
}


화면 스냅샷의 다른 객체를 표시하고 숨기는 예시를 만들었습니다.

좋은 웹페이지 즐겨찾기