[ios] CALayer
안녕하세요. 오늘은 iOS에서 상당히 중요한 역할을 하지만 생각보다 다룰일이 많이 없었던 UIView의 layer프로퍼티인 CALayer를 공부해보았고 제가 이해한 것을 바탕으로 기록을 해보고자 이렇게 글을 작성하게 되었습니다.
저는 layer 프로퍼티를 다뤄본 것이라고는 cornerRadius를 설정할 때와 AVPlayerLayer를 UIView에 추가를 해본 것이 전부였습니다. 그것을 사용할 때도 그저 이렇게 쓰나 보다 하여 사용했지 layer의 존재 이유와 그것이 정확히 어떤 역할을 하는지 알지 못하였습니다. 하지만 이번 기회를 통해 layer의 역할이 굉장히 중요하다는 것을 알게 되었습니다. 그럼 바로 시작해보도록 하겠습니다.
Graphics in iOS
먼저 CALayer에 대해 알아보기 전 iOS에서 화면에서 보여주는 여러 그래픽스 요소들을 그려내기 위해 어떤 것들이 존재하는지부터 알아보도록 하겠습니다.
먼저 OpenGL은 iOS 디바이스의 그래픽스 하드웨어와 가장 빠르고 직접적인 접근을 지원합니다. 하지만 이렇게 하드웨어에 높은 접근성을 지원하는만큼 간단한 작업조차 상당히 많은 양의 코드를 필요로합니다.
이런 식으로 단계적으로 아래 단계의 불편함을 보완하고자 Core Graphics와 Core Animation 등이 만들어졌습니다. 그리고 CALayer는 Core Animation이 제공하는 요소 중 하나이고 이 CALayer를 제공합니다. 이렇게 상위 수준의 Core Animation이 CALayer를 제공하기 때문에 보다 편리하게 그래픽스 하드웨어에 직접적인 접근을 지원하고 빠른 속도로 작업을 처리할 수 있습니다.
CALayer
CALayer는 실제로 UIView에 속하며 UIView를 지원해주는 역할을 합니다. 각 뷰마다 루트 layer는 하나씩 존재하고 이 루트 layer는 각각 SubLayer들을 갖습니다.
UIView는 레이아웃과 터치 이벤트 처리 등 많은 작업을 합니다. 하지만 실제로 뷰 위에 컨텐츠나 애니매이션을 그리는 행위는 직접적으로 다루지 않고 UIKit가 이러한 작업들을 Core Animation에 위임합니다. 즉 실질적으로 뷰 위에 컨텐츠와 애니매이션을 그리는 행위는 CALayer가 담당하게 됩니다.
이러한 점에서 UIView는 사실 CALayer를 감싸고 있는 것에 불과합니다. 그렇기 때문에 UIView의 bounds가 변경되면 UIView는 자신의 루트 layer의 bounds를 변경합니다. 이렇게 루트 layer의 레이아웃은 속해있는 UIVIew에 맞추어 자동으로 변경됩니다. (하지만 SubLayer들은 자동으로 맞추어지지 않습니다.)
그럼 바로 코드를 통해 layer에는 어떤 프로퍼티가 있는지 알아보도록 하겠습니다.
Implementation
이번 포스팅에서는 간단하게 cornerRadius와 shadow만을 다뤄보도록 하겠습니다.