Swift + iOS/iOS

[ios] UIControl

군옥수수수 2018. 6. 7. 01:23

[ios] UIControl


안녕하세요. 현재 저는 Understanding Event Handling, Responders, and the Responder Chain 문서를 읽어보며 이벤트 핸들링에 대해 보다 자세히 알기 위해 공부를 하고 있습니다.


이를 위해 문서를 읽으면서 공부하고 알게 된 몇 가지 내용들을 정리해고자 합니다. 오늘은 바로 UIControl입니다. 그럼 바로 시작해보도록 하겠습니다.

UIControl

UIControl은 간단히 설명하자면 특정 액션이나 사용자의 의도(드래그, 버튼 클릭 등등)를 전달하는 시각적인 요소들의 기반이 되는 클래스입니다. UIControl 클래스를 상속하는 클래스로는 대표적으로 UIButton 클래스가 있습니다. UIButton의 문서를 UIControl을 상속한다고 명시되어 있습니다.



즉 사용자에게 보여지는 뷰가 보다 사용자와 상호작용할 수 있게끔 능력을 부여해주는 클래스이기도 합니다. UIControlTarget-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을 만드는 예제를 제공하는데요. 이 역시 UIStackViewUIControl을 상속받지 않기 때문에 이를 상속하는 것부터 시작합니다.


해당 문서의 링크 : Implement a Custom Control


마무리

오늘은 이렇게 이벤트 핸들링에 관한 문서를 공부하면서 접한 UIControl에 대해 공부한 것을 기록해보았습니다. 감사합니다.


참고자료


  1. UIControl
  2. UIButton
  3. Custom Controls
  4. [Understanding Event Handling, Responders, and the Responder Chain