[ios] UIControl
[ios] UIControl
안녕하세요. 현재 저는 Understanding Event Handling, Responders, and the Responder Chain 문서를 읽어보며 이벤트 핸들링에 대해 보다 자세히 알기 위해 공부를 하고 있습니다.
이를 위해 문서를 읽으면서 공부하고 알게 된 몇 가지 내용들을 정리해고자 합니다. 오늘은 바로 UIControl
입니다. 그럼 바로 시작해보도록 하겠습니다.
UIControl
UIControl
은 간단히 설명하자면 특정 액션이나 사용자의 의도(드래그, 버튼 클릭 등등)를 전달하는 시각적인 요소들의 기반이 되는 클래스입니다. UIControl
클래스를 상속하는 클래스로는 대표적으로 UIButton
클래스가 있습니다. UIButton
의 문서를 UIControl
을 상속한다고 명시되어 있습니다.
즉 사용자에게 보여지는 뷰가 보다 사용자와 상호작용할 수 있게끔 능력을 부여해주는 클래스이기도 합니다. UIControl
은 Target-Action이라는 매커니즘을 이용해 사용자의 액션들을 앱에 전달합니다.
이 Target-Action 매커니즘은 addTarget(_:action:for:)
메소드를 이용하여 구현합니다. 파라미터로 액션을 담당할 객체, 액션에 대한 행위를 정의해준 메소드, 그리고 어느 액션(.touchUpInsider
, .valueChanged
등등)에 대해 해당 메소드를 호출할 것인지를 넘겨줍니다.
또한 UIControl
클래스의 속성에는 상태라는 속성이 존재하는데 이 상태는 해당 뷰의 모습과 사용자의 액션에 대한 기능을 결정하는 역할을 합니다. 이 상태라는 속성은 사용자의 액션에 대해 원하는대로 직접 구현해줄 수 있습니다. 당연히 이렇게 설명을 하면 와닿지 않을 수 있습니다. 예를 들어보도록 하겠습니다.
위에서 언급했듯이 UIControl
을 상속받는 대표적인 뷰는 바로 UIButton
클래스입니다. UIButton
를 다루어보셨다면 다음과 같은 메소드들을 많이 보셨을 것입니다.
func setTitle(String?, for: UIControl.State)
- 상태에 따른 타이틀을 지정해주는 메소드
func setImage(UIImage?, for; UIControl.State)
- 상태에 따른 이미지를 지정해주는 메소드
func setTitleColor(UIColor?, for: UIControl.State)
- 상태에 따른 타이틀의 색을 지정해주는 메소드
위의 코드에서 가장 중요한 것은 유저의 액션이 들어올 때마다 상태의 변화를 직접 작성해주어야 한다는 것입니다. 디폴트 상태는 .normal
로 나머지 상태는 모두 false
입니다.
반면 UIView
클래스는 UIControl
을 상속받지 않습니다. 그렇기 때문에 따로 addTarget(_:action:for:)
메소드를 지정해줄 수 없는 것입니다.
그렇기 때문에 Custom Control을 만들기 위해서는 반드시 UIControl
클래스를 상속받아야 합니다. Custom Control을 만들어보는 예제는 구글링을 통해 쉽게 찾아볼 수 있습니다. 애플의 공식 가이드 문서에서도 UIStackView
을 활용하여 Custom Control을 만드는 예제를 제공하는데요. 이 역시 UIStackView
는 UIControl
을 상속받지 않기 때문에 이를 상속하는 것부터 시작합니다.
해당 문서의 링크 : Implement a Custom Control
마무리
오늘은 이렇게 이벤트 핸들링에 관한 문서를 공부하면서 접한 UIControl
에 대해 공부한 것을 기록해보았습니다. 감사합니다.
참고자료
- UIControl
- UIButton
- Custom Controls
- [Understanding Event Handling, Responders, and the Responder Chain