์๋ ํ์ธ์~ ๋ฆด๋ฆฌ์ด์ ๋๋ค๐
์ค๋์ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฒ ๊ฐ์ง๋ง, ๋ค๋ฅธ UIView์ CALayer์ ํน์ง๋ค๊ณผ ์ฐจ์ด์ ์ ๋ํด ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค.
CALayer ์ด๋์ ๋ดค๋๋ผ?UIView์ ๊ทธ๋ฆผ์(shadow)๋ ๊ฒฝ๊ณ์ (border)์ ์ค์ ํ  ๋, layerํ๋กํผํฐ๋ฅผ ํตํด ์ค์ ํ๋ ๊ฒฝํ ํ ๋ฒ์ฉ์ ์์ผ์ค ๊ฒ ๊ฐ์ต๋๋ค. 
 var cellContainerView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = UIColor.pink
        // ๊ทธ๋ฆผ์
        view.layer.shadowColor = UIColor.grey.cgColor
        view.layer.shadowOpacity = Float(1)
        view.layer.shadowOffset = CGSize(width: 0, height: 1)
        view.layer.shadowRadius = CGFloat(0.5)
        // ์ฝ๋ ์ง๊ฒฝ
        view.layer.cornerRadius = CGFloat(6)
        return view
    }()
๋ทฐ์ ๊ทธ๋ฆผ์์ ํ
๋๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ๋๋ฐ layer๋ฅผ ๊ฑฐ์ณ์ผํ๋ค๋ ๊ฑธ ๋ณด๋,
๋ณด์ฌ์ง๋ ๋ถ๋ถ๊ณผ ๊ด๋ จ๋ ๊ฐ์ฒด์ธ ๊ฒ ๊ฐ๊ณ , ํฌํ ์ต์ ํ  ๋ ์ฌ์ฉํ๋ layer์ ๋น์ทํ ์ญํ ์ ํ  ๊ฒ ๊ฐ์ต๋๋ค๐ง
UIView, CALayer์ ๊ทผ๋ณธUIView์ layer ํ๋กํผํฐ๋ CALayer๋ผ๋ ํ์
์
๋๋ค.
var layer: CALayer { get }
CALayer๋  CoreAnimation ํ๋ ์์ํฌ์ ์ํ ๊ฐ์ฒด์
๋๋ค.
๋ฐ๋ฉด, UIView๋ UIKit ํ๋ ์์ํฌ ์์์ด์ง์.
์ด ๋์ ์ฌ์ค ๊ฐ์ ๋ฟ๋ฆฌ์์ ํ์๋ ๊ฐ์ฒด๋ค์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.

OpenGL์ Graphic Hardware๋ฅผ ํตํด ๊ทธ๋ํฝ ์์ ์ ํ ์ ์๋ API๋ก, ๊ทธ๋ํฝ ํ๋์จ์ด์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค. iOS8์ดํ๋ก๋ OpenGL๋์ Metal์ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ ์์ค์ด๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์์ ์๋ ๋ง์ ์ฝ๋๋ฅผ ํ์๋กํ๋ค๋ ๋จ์ ์ด ์์ง์.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด CoreGraphics๋ผ๋ ํ๋ ์์ํฌ์ด๊ณ ,
CoreGraphics ๋ํ ์ ์์ค์ด๊ธฐ ๋๋ฌธ์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ  ์ ์๋๋ก CoreAnimation์ด๋ผ๋ ํ๋ ์์ํฌ๊ฐ ๋ง๋ค์ด์ก๋ค๊ณ  ํฉ๋๋ค.
CoreAnimation์ ๊ทธ๋ํฝ์ ๊ตฌํํ๊ธฐ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ด ํฌํจ๋์ด ์์๊ณ , ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ฝ๋๋ก ๊ฐ๋จํ๊ฒ ํ์ํ ํ๋ ์์ํฌ๊ฐ ๋ฐ๋ก, UIKit์ธ ๊ฒ์ ๋๋ค.
๊ฐ์ ๋ฟ๋ฆฌ์์ ์ปจํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ์ํด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ณตํต์ ์ ์ง๋๊ณ ์์๋ ๊ฒ์ด์๊ตฐ์!
์ ํ ๊ณต์๋ฌธ์์์ ์๊ฐํ๋ API๋ค์ ์ดํด๋ณด๋ฉด, ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ด ๋งค์ฐ ๋น์ทํ ๊ฑธ ํ์ธํ ์ ์์์ต๋๋ค.
UIResponder์ ์๋ธํด๋์ค์ด๋ฏ๋ก ํฐ์น๋ ๋ค๋ฅธ ํ์
์ ์ด๋ฒคํธ์ ๋ํด ์๋ตํ  ์ ์๋ค.draw()๋ฅผ ํธ์ถํ๋๋ฐ, ์ด ์์
์ CPU์ main thread์์ ์ผ์ด๋๋ฏ๋ก ๋น์ฉ์ด ๋น์ธ๋คํฐ ์ญํ ๋ค์ ๋ฐ๋ผ API๋ฅผ ํ ๋ฒ ๋น๊ตํด๋ณด์์ต๋๋ค.
| UIView | CALayer | 
|---|---|
![]()  | ![]()  | 
UIView์ CALayer ๋ชจ๋ backgroundColor๋ opaque ์์ฑ๊ณผ ๊ฐ์ด ์๊ฐ์  ํน์ฑ, ์ขํ๊ณ ํน์ฑ(frame, bounds...)์ ์ค์ ํ  ์ ์์ต๋๋ค. 
๊ทธ๋ฐ๋ฐ CALayer๊ฐ border,shadow, anitaliasing ๊ฐ์ด ๋ ๋ง์ ์๊ฐ์  ์์ฑ๋ค์ ์กฐ์ํ  ์ ์๋ค์.
UIView์ CALayer๋ ๊ณตํต์ ์ผ๋ก ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฑํฉ๋๋ค. 
| UIView | CALayer | 
|---|---|
![]()  | ![]()  | 
UIView๋ superview์ subview,
CALayer๋ superlayer์ sublayer๋ก ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ์ ์ํ์ฃ .
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ API๋ค์ด ์ ๊ณต๋๊ณ ์์ต๋๋ค.
| UIView | CALayer | 
|---|---|
![]()  | ![]()  | 
๊ณตํต์ ์ผ๋ก ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฉ์๋๊ฐ ์ ๊ณต๋ฉ๋๋ค.
์์น์ ์ฌ์ด์ฆ๋ฅผ ๊ฒฐ์ ํ๋ ๋ ์ด์์ ๊ด๋ จ ๋ฉ์๋๋ค๋ ์ ๊ณต๋ฉ๋๋ค.
๋ ๊ฐ์ฒด ๋ชจ๋ constraints(์ ์ฝ)์ ์ฌ์ฉํด ์์ ๊ฐ์ฒด์์ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ์ด์์์ ๊ฒฐ์ ํ  ์ ์์ต๋๋ค.
(UIKit -> NSLayoutConstraints / CALayer -> CAConstraints)
ํ์ง๋ง, CAConstraints๋ iOS๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
| UIView | CALayer | 
|---|---|
![]()  | ![]()  | 
UIView์์ autoLayout๊ณผ ๊ด๋ จ๋ ํจ์ฌ ๋ง์ API๋ค์ด ์ ๊ณต๋๊ณ  ์๋ ๊ฒ์ ํ์ธํ  ์ ์์์ต๋๋ค.
๋ฟ๋ง ์๋๋ผ CALayer์๋ ์๋ safeArea, margin๊ณผ ๊ฐ์ ๋ ์ด์์ ๊ฐ์ด๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๊ณตํ๊ณ  ์์ต๋๋ค. 
๊ณตํต์ ์ผ๋ก animatableํ property(frame,bounds, alpha...)์ ๊ฐ์ ๋ณ๊ฒฝ์์ผ์ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ  ์ ์์ต๋๋ค. 
UIView์ ์ ๋๋ฉ์ด์
 ๋ํ ์ค์ ๋ก๋ CoreAnimation์ ์ํด ์๋ํฉ๋๋ค.
UIView์์ ์ ๊ณตํ๋ ์ ๋๋ฉ์ด์
 ๊ด๋ จ API๋ CoreAnimation์ wrapper๋ผ๊ณ  ๋ณผ ์ ์์ต๋๋ค. 
| UIView | CALayer | 
|---|---|
![]()  | ![]()  | 
UIView๊ฐ UITextView, UIStackView, UIScrollView ๋ฑ ๋ค์ํ ์๋ธํด๋์ค๋ฅผ ๊ฐ์ง๋ ๊ฒ ์ฒ๋ผ, CALayer์๋ ๋ค์ํ ์ข
๋ฅ์ ์๋ธํด๋์ค๊ฐ ์์ต๋๋ค.
CATextLayerCAShapeLayerCAGradientLayerCAEmitterLayerCAScrollLayerCATiledLayerCATransformLayerCAReplicatorLayerCAMetalLayer์์์ ์ ๊น ์ธ๊ธํ ๊ฒ์ฒ๋ผ UIView๋ ์ปจํ
์ธ ์ ๋๋ก์๊ณผ ์ ๋๋ฉ์ด์
์ ์ง์  ์ํํ์ง ์๊ณ , CoreAnimation์๊ฒ ์์ํฉ๋๋ค. ์ปจํ
์ธ ์ ์กฐ์๊ณผ ๊ด๋ จ๋ API๋ค์ ์ ๊ณตํ์ง๋ง CoreAnimation์ ์ด์ฉํ๋ ๊ฒ์ด์ฃ .
๊ทธ ์ค CALayer๋ ์ปจํ
์ธ ๋ฅผ ์บก์ฒํ์ฌ ๋นํธ๋งต์ผ๋ก backing store์ ์บ์ฑํฉ๋๋ค. ์ด๋ ๋ ์ด์ด์ ํ๋กํผํฐ์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด Core Animation์ ํด๋น ๋ ์ด์ด์ ๋นํธ๋งต๊ณผ ์ํ์ ๋ณด๋ฅผ GPU๋ก ๋ณด๋ด๊ณ , GPU๊ฐ ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ก์ด ๋นํธ๋งต์ ๊ทธ๋ฆฝ๋๋ค(๋ ๋๋ง). View์ draw(_:)๊ฐ ๋ฉ์ธ์ค๋ ๋์ CPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, CPU์ ๋ถ๋ด์ ์ฃผ์ง ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
CALayer๋ GPU๋ฅผ ์ฌ์ฉํด ๋ ๋๋ง์ ์ํํ๊ธฐ ๋๋ฌธ์ CPU์ ๋ฉ์ธ์ค๋ ๋์ ๋ถํ๋ฅผ ์ฃผ์ง ์์ต๋๋ค.CALayer๋ UIView๋ณด๋ค ๊ฐ๋ณ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ๋ ๋๋ง ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํ ํ๋กํผํฐ๋ ์ ๊ณตํฉ๋๋ค.
UIView๋ CALayer์ delegate์ด๋คUIView๋ ๋ ๋๋ง์ ์ํ rootlayer๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ต๋๋ค.
var layer: CALayer { get }

๊ทธ๋ฆฌ๊ณ  UIView๊ฐ layer์ ๋ธ๋ฆฌ๊ฒ์ดํธCALayerDelegate์
๋๋ค.
CALayerDelegate๋ ํฌ๊ฒ ์๋์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
func display(CALayer)func layoutSublayers(of: CALayer)func action(for: CALayer, forKey: String) -> CAAction?@MainActor class UIView : UIResponder
UIKit์ UIView๋ CALayer์ ๋ฌ๋ฆฌ UIResponder์ ์๋ธํด๋์ค์ด๊ธฐ ๋๋ฌธ์ Responder chain๋ด์์ ์ฌ์ฉ์ ํฐ์น ๋๋ gesture ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ํธ๋ค๋ง ํ  ์ ์์ต๋๋ค.
๋ํ gestureRecognizer๋ฅผ ์ฌ์ฉํ์ฌ common gesture๋ฅผ ํธ๋ค๋งํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด CALayer๋ ์ด๋จ๊น์?
UIResponder๋ฅผ ์์ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์์ง๋ง, hitTest, contains๋ฅผ ๊ตฌํํ๊ณ  ์๊ธฐ ๋๋ฌธ์, Layer๋จ์์ ํฐ์น ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ  ์๋ ์์ต๋๋ค. 
์์์ ์ธ๊ธํ ์ฐจ์ด์  ์ธ์๋ ๊ฐ ๊ฐ์ฒด๋ ์๋์ ๊ฐ์ ์ถ๊ฐ์  ๊ธฐ๋ฅ์ ๊ฐ์ง๋๋ค.
UIView
CALayer
CALayer๋ฅผ ์ฌ์ฉํ๋ wrapper, ์ค์  ๋๋ก์๊ณผ ๋ ๋๋ง์ CoreAnimation์๊ฒ ์์UIResponder์ ์๋ธํด๋์ค, Responder Chain์ ์ํ๋ฏ๋ก ์ฌ์ฉ์ ์ด๋ฒคํธ ํธ๋ค๋ง์ ์ง์UIView๋ณด๋ค ๊ฐ๋ณ๊ณ  ์ฑ๋ฅ์ด ์ข์)UIView์์ ์ ๊ณตํ์ง ์๋ ์ธ๋ฐํ ์ปจํ
์ธ  ์ปจํธ๋กค์ด ๊ฐ๋ฅUIView๋ ์ปจํ
์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ฌ์ฉ์์ ์ธํฐ๋ ์
ํ  ์ ์๋ ์ฌ๊ฐํํ์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ UI Component์ด๋ค.
CALayer๋ UIView์ ๊ธฐ๋ฐ์ ์ ๊ณตํ๋ค. ํ์ง๋ง CALayer๋ง ์ฌ์ฉํด์ UI๋ฅผ ๊ตฌํํ  ์ ์๋ค. 
UIView์์ ํ  ์ ์๋ ์ด๋ฏธ์ง๊ฐ ํฉ์ฑ, ๋ณต์กํ ์ ๋๋ฉ์ด์
, ์ต์ ํ๊ฐ ํ์ํ๋ค๋ฉด, CALayer๋ก ๋๋ก์, ์ ๋๋ฉ์ด์
์ ๊ตฌํํ์
์ ์ ํ ๊ณต์๋ฌธ์ - CoreAnimation Programming Guide
CALayer Tutorial
CALayer๋
iOS) CALayer ์ ๋๋ก ์ดํดํ๊ธฐ
TUTORIAL A Beginnerโs Guide to CALayer