일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PHP
- 파일 시스템
- windosws wbcs
- web
- 재귀
- 스택
- 정렬 알고리즘
- LoB
- windosw 문자열
- C
- SWiFT
- OSI
- ftz level13
- System
- Java
- 큐
- level13
- 시간복잡도
- 백준
- HTML
- 두근두근 자료구조
- 암호수학
- Stack
- 파이썬
- c언어
- ftz
- 미로 탐색 알고리즘
- pwnable.kr
- 자료구조
- War Game
- Today
- Total
나의 기록, 현진록
[iOS] UIView & CALayer 본문
1. 역사?
iOS에서 부드러운 화면이 출력되기 위해 초당 60 프레임의 주사율을 유지하기 위해 GPU에서 직접 실행되는 그래픽에 강한 OpenGL을 사용하였다. C 기반의 API이므로 이식성이 뛰어나고 Object-C Cocoa Touch 앱과 완벽하게 통합된다고 한다. 최대 장점은 그래픽 하드웨어에 가장 빠르게 액세스할 수 있다는 것이지만 Low-Level API 이기 때문에 코드 양이 방대하고 난이도가 높다고 한다. 보다 쉽게 그래픽을 구현할 수 있는 Core Graphics(CGColor, CGRect...)라는 것도 생겼지만 Low-Level이다.
이를 대체하기 위해 만들어진 것이 Core Animation(CALayer...)이며 더욱 더 간편하게 만든 것이 UIKit이다. 따라서 UIKit으로 High-Level에서 그래픽을 접근할 수 있게 된다. 단점이라고 하면 지속적으로 단순화 시켜서 Low-Level API보다 기능이 제한적이라는 점이다.
UIKit으로 프로그래밍을 진행하다 보면 UIView의 backgroundColor를 설정할 때
UIView.layer.backgroudColor = .red
UIView.backgroundColor = .red
이 두가지가 어떤 차이점이 있을까 생각해본 적이 있지만 찾아보진 않았던 것 같다. UIView와 CALayer와 backgroundView랑 각각 다른 계층인가 싶기도 하고... 의문을 풀어보고자 이 글을 쓰게 됐다.
2. UIView와 CALayer의 관계
iOS에서 실제 시각적으로 보여지는 부분은 UIView 자체가 아닌 UIView 내부에 있는 Layer에 그려지는 것이라고 한다. UIView는 레이아웃, 이벤트 상호작용 등의 작업을 처리하지만 컨텐츠(UI 컴포넌트)나 애니메이션을 그리는 행위는 Core Animation에 위임하게 되는데 그 작업을 처리 하는 게 CALayer이다.
UIView의 layer는 이미지 기반의 컨텐츠를 관리하고 해당 컨텐츠에 애니메이션을 수행할 수 있는 객체이며 절대 nil이 되어서는 안 된다고 한다. 여기서 CA는 Core Animation이다.
UIView는 하나의 CALayer(Root)를 가지고 있다. 또한 Root layer는 여러 개의 sublayer를 가질 수 있다.
UIView를 여러 개 만드는 것보다 CALayer를 여러 개 생성하는 것이 훨씬 가볍고 더 나은 퍼포먼스를 기대할 수 있다고 한다.
뷰의 backgroundColor, border, shadow 같은 속성도 모두 CALayer 객체이다. 그래서 View에 BackgroundColor를 수정하여도 내부적으로는 그려지는 부분을 담당하는 것이 Layer이기 때문에 Layer의 BackgroundColor가 변경된다. 반대의 경우에도 layer의 BackgroundColor을 수정하면 자동적으로 View의 BackgroundColor가 설정된다.
View의 기본 layer class는 오버라이드가 가능하다. CALayer 타입이라는 조건만 만족하면 된다.
'iOS' 카테고리의 다른 글
[Swift] RxSwift (0) | 2025.02.24 |
---|---|
[iOS] App Launch Sequence (0) | 2025.02.20 |
[iOS] iOS 뷰 계층 구조 (0) | 2025.02.17 |
[SwiftUI] @ObservedObject @StateObject 관련 트러블 슈팅 (0) | 2024.11.27 |
[iOS] 탭 바 이동 시 애니메이션 적용하기 (0) | 2024.09.15 |