티스토리 뷰

iOS/iOS-AutoLayout

Programmatically Creating Constraints

malrang-malrang 2022. 4. 29. 19:17

Programmatically Creating Constraints

오토레이아웃의 조건 들을 코드로 작성해보자!

위의 조건들을 코드로 작성할수 있도록 해보자!

  • 버튼은 safeArea 에서 좌우 20 포인트만큼 떨어져있다.
  • 버튼의 y축은 superView에서 최소 20 만큼 떨어져있다.(우선도 높음)
  • 버튼의 y축은 safeArea에서 0 만큼 떨어져있다.(우선도 중간)

Layout Anchors(레이아웃 앵커)

  • 가장 간단하고 안전한 방법중 하나이다.
  • 코드가 간결해진다.
  • 오류체크가 간편하다.
class AnchorViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton()
        button.setTitle("Button", for: UIControl.State.normal)
        button.setTitleColor(.white, for: .normal)
        button.backgroundColor = .systemGreen
        view.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false

        let safeArea = view.safeAreaLayoutGuide

        button.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor, constant: 16 ).isActive = true
        button.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor, constant: -16 ).isActive = true
        let safeBottomAnchor = button.bottomAnchor.constraint(equalTo: safeArea.bottomAnchor)
        safeBottomAnchor.isActive = true
        safeBottomAnchor.priority = .defaultHigh

        let viewBottomAnchor = button.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -20)
        viewBottomAnchor.isActive = true
    }
}
  • .isActive 는 활성화 시켜줄것을 의미한다 Bool 값을 가질수있다. 조건은 변수에 할당해준뒤 해당변수에.isActive 에 Bool 값을 넣어줘도 가능하다.
  • 우선도의 값을 직접 작성하고 싶을때는 이와 같은 방법으로safeBottonAnchor.priority = .init(999)
  • 상관관계 에 대해 생각해보아야한다. 양수인지 음수인지, Equal 이 아니라면 어떤것이 들어가야하는지
  • First, Second 아이템의 관계를 생각해보아야 한다.

LayoutConstraint Class

인스턴스를 직접 만드는 방법!

class ConstraintViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton()
        button.setTitle("Button", for: UIControl.State.normal)
        button.setTitleColor(.white, for: .normal)
        button.backgroundColor = .systemGreen
        view.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false

        let safeArea = view.safeAreaLayoutGuide

        let leading = NSLayoutConstraint(item: button,
                                         attribute: .leading,
                                         relatedBy: .equal,
                                         toItem: safeArea,
                                         attribute: .leading,
                                         multiplier: 1,
                                         constant: 16)

        let trailing = NSLayoutConstraint(item: button,
                                          attribute: .trailing,
                                         relatedBy: .equal,
                                         toItem: safeArea,
                                          attribute: .trailing,
                                         multiplier: 1,
                                         constant: -16)

        let bottomSafeArea = NSLayoutConstraint(item: button,
                                                attribute: .bottom,
                                                relatedBy: .equal,
                                                toItem: safeArea,
                                                attribute: .bottom,
                                                multiplier: 1,
                                                constant: 0)
        bottomSafeArea.priority = .defaultHigh

        let bottomView = NSLayoutConstraint(item: button,
                                                attribute: .bottom,
                                                relatedBy: .lessThanOrEqual,
                                                toItem: view,
                                                attribute: .bottom,
                                                multiplier: 1,
                                                constant: -20) 
        NSLayoutConstraint.activate([leading,trailing,bottomView,bottomSafeArea])

    }
}
  • 앵커레이아웃으로 불가능한것을 가능하게 하는 상황이 있음 그럴때 사용하면 유용하다.
  • 논리적 오류가 발생했을때? 오류로 알려주지 않는다.
  • 앱실행시 크래쉬가나서 앱이 죽어버린다.
  • 앵커에서 오류체크가 가능한것은 제네릭기법을 사용하기때문이다

'iOS > iOS-AutoLayout' 카테고리의 다른 글

stack-view  (0) 2022.04.29
AutoLayout  (0) 2022.04.29
Interface Builder 의 도구들  (0) 2022.04.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함