Things take time

[SWIFT] AutoLayout, 안드로이드의 Visibility Gone과 같은 옵션 사용하기(컴포넌트 삭제(숨김)시 자동 맞춤) 본문

iOS (기능)

[SWIFT] AutoLayout, 안드로이드의 Visibility Gone과 같은 옵션 사용하기(컴포넌트 삭제(숨김)시 자동 맞춤)

겸손할 겸 2018. 1. 9. 08:57

[개요]


안드로이드의 각 컴포넌트에는 visibility란 속성이 있고 그 값에는 visible, invisible, gone 뭐 이런애들이 있다.

그 중 invisible과 gone의 차이는 컴포넌트를 숨길것인지(Invisible), 아니면 숨기면서 해당 차지하는 공간까지를 숨길것인지(Gone)에 대해 정의할 수 있다.


이를 iOS에 대입을 하게 되면 

isHidden이란 옵션을 true, false로 하여 가시성에 대한 옵션을 줄 수 있는데, 문제는 Gone에 해당하는 옵션이 속성으로 따로 없다.


아래 예를 보자.



Button1, Button2, Button3 으로 이루어진 뷰가 하나 있다.


로직은 다음과 같다.


버튼2를 누르면 버튼 2는 숨김 옵션이 된다.

1) 숨김처리만 한다 => inVisible

2) 숨김처리를 하면서 버튼3은 버튼2의 자리로 올라온다 => Gone



이것이 숨김처리만 한 경우



이것은 숨김처리와 동시에 버튼2의 자리에 버튼3이 온 것이다.


일반적으로 오토레이아웃을 사용할때는 높이, 너비, 그리고 superview와의 margin을 입력하여, 해상도에 따른 자동 수정이 가능하도록 작성한다.

그런데 기본적으만 작성하는 것으로는 오토레이아웃으로 응용할 수 있는 것이 너무 적다.


결론적으로는 NSConstraint를 Outlet으로 연결하여 해당 값을 조절하면 된다.


Button3의 top은 Button2의 위치에서 50아래로 지정했다.




그렇다면 그 50의 constant값을 조절하면 된다. 이를 스토리보드에서 가져오려면 해당 높이의 값을 소스상으로 가져온다.



이름은 btn2AndBtn3Height라고 지었다.


[코드]

Button2의 액션 이벤트에 아래와 같이 넣자.

    @IBAction func button2Clicked(_ sender: UIButton) {
        button2.isHidden = true
        btn2AndBtn3Height.constant = 0 - button2.frame.height
    }

숨김옵션 뿐만이 아니라, 버튼2와 버튼3의 공간의 constant 값을 0으로하게 되면, 버튼2가 사라질때, 버튼3은 버튼2의 밑에 위치하게 된다.

그런데 그 버튼2의 바로 밑에 위치하기 때문에, 버튼3의 위치를 대신하는 것이 아니다. 이런다면 버튼2의 높이 값을 구해서 그 값만큼을 더 - 해버리면 버튼3은 버튼2의 위치를 대신하게 된다.