UIView ๐Ÿ†š CALayer ์ฐจ์ด์ 

Lilyยท2022๋…„ 11์›” 8์ผ
1

์•ˆ๋…•ํ•˜์„ธ์š”~ ๋ฆด๋ฆฌ์ด์ž…๋‹ˆ๋‹ค๐Ÿ˜ƒ

์˜ค๋Š˜์€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‹ค๋ฅธ 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๋“ค์„ ์‚ดํŽด๋ณด๋ฉด, ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋งค์šฐ ๋น„์Šทํ•œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

UIView

  • ์‚ฌ๊ฐํ˜• ์˜์—ญ(CGRect)์•ˆ์—์„œ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌ
  • 1๏ธโƒฃย Drawing and animation
    • ์ปจํ…์ธ ๋ฅผ UIKit์ด๋‚˜ Core Graphics์„ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ๊ฐ ์˜์—ญ์•ˆ์— ๊ทธ๋ฆฐ๋‹ค.
    • ๋ทฐ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์คŒ์œผ๋กœ์จ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • 2๏ธโƒฃย Layout and subview management
    • View๋Š” 0๊ฐœ ์ด์ƒ์˜ subview๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
    • View๋Š” ์ž์‹ ์˜ subview์˜ ์‚ฌ์ด์ฆˆ์™€ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ด์„œ ๋ทฐ ๊ณ„์ธต๊ตฌ์กฐ ๋ณ€ํ™”์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ์˜ resizing, repositioning ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 3๏ธโƒฃย Event Handling
    • UIResponder์˜ ์„œ๋ธŒํด๋ž˜์Šค์ด๋ฏ€๋กœ ํ„ฐ์น˜๋‚˜ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • gesture recognizer๋ฅผ ์„ค์น˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • view์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด draw()๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด ์ž‘์—…์€ CPU์˜ main thread์—์„œ ์ผ์–ด๋‚˜๋ฏ€๋กœ ๋น„์šฉ์ด ๋น„์‹ธ๋‹ค

CALayer

  • ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์˜ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌ
  • ์ปจํ…์ธ ๋ฅผ ์บก์ฒ˜ํ•œ ๋น„ํŠธ๋งต์„ backingstore์— ์บ์‹ฑํ•œ๋‹ค
  • ์บ์‹œ๋œ ๋น„ํŠธ๋งต๊ณผ ๊ด€๋ จ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ทธ๋ž˜ํ”ฝ ํ•˜๋“œ์›จ์–ด์— ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ํ•˜๋“œ์›จ์–ด๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ ์ •๋ณด๋กœ ๋น„ํŠธ๋งต์„ ๋ Œ๋”๋งํ•œ๋‹ค. ํ•˜๋“œ์›จ์–ด์ด๋ฏ€๋กœ ์†Œํ”„ํŠธ์›จ์–ด๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค
  • ๋ ˆ์ด์–ด ์ž์ฒด์— ์‹œ๊ฐ์  ํ”„๋กœํผํ‹ฐ(backgroudColor, border, shadow...) ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ขŒํ‘œ์  ํ”„๋กœํผํ‹ฐ(position, size, transform)์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค

ํฐ ์—ญํ• ๋“ค์— ๋”ฐ๋ผ API๋ฅผ ํ•œ ๋ฒˆ ๋น„๊ตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ณด์—ฌ์ง€๋Š” ์ปจํ…์ธ ์˜ ํŠน์„ฑ ์„ค์ •

UIViewCALayer

UIView์™€ CALayer ๋ชจ๋‘ backgroundColor๋‚˜ opaque ์†์„ฑ๊ณผ ๊ฐ™์ด ์‹œ๊ฐ์  ํŠน์„ฑ, ์ขŒํ‘œ๊ณ„ ํŠน์„ฑ(frame, bounds...)์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ CALayer๊ฐ€ border,shadow, anitaliasing ๊ฐ™์ด ๋” ๋งŽ์€ ์‹œ๊ฐ์  ์†์„ฑ๋“ค์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„ค์š”.

๊ณ„์ธต๊ตฌ์กฐ

UIView์™€ CALayer๋Š” ๊ณตํ†ต์ ์œผ๋กœ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

UIViewCALayer

UIView๋Š” superview์™€ subview,
CALayer๋Š” superlayer์™€ sublayer๋กœ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜์ฃ .

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” API๋“ค์ด ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๋””์Šคํ”Œ๋ ˆ์ด

UIViewCALayer

๊ณตํ†ต์ ์œผ๋กœ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.


๋ ˆ์ด์•„์›ƒ

์œ„์น˜์™€ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋“ค๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
๋‘ ๊ฐ์ฒด ๋ชจ๋‘ constraints(์ œ์•ฝ)์„ ์‚ฌ์šฉํ•ด ์ƒ์œ„ ๊ฐ์ฒด์™€์˜ ๊ด€๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(UIKit -> NSLayoutConstraints / CALayer -> CAConstraints)
ํ•˜์ง€๋งŒ, CAConstraints๋Š” iOS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UIViewCALayer

UIView์—์„œ autoLayout๊ณผ ๊ด€๋ จ๋œ ํ›จ์”ฌ ๋งŽ์€ API๋“ค์ด ์ œ๊ณต๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CALayer์—๋Š” ์—†๋Š” safeArea, margin๊ณผ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ ๊ฐ€์ด๋“œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์• ๋‹ˆ๋ฉ”์ด์…˜

๊ณตํ†ต์ ์œผ๋กœ animatableํ•œ property(frame,bounds, alpha...)์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UIView์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋˜ํ•œ ์‹ค์ œ๋กœ๋Š” CoreAnimation์— ์˜ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
UIView์—์„œ ์ œ๊ณตํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ด€๋ จ API๋Š” CoreAnimation์˜ wrapper๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UIViewCALayer

๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ CALayer์˜ ์„œ๋ธŒํด๋ž˜์Šค

UIView๊ฐ€ UITextView, UIStackView, UIScrollView ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ, CALayer์—๋„ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CATextLayer
    string ๋˜๋Š” atttributed string์˜ ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋ Œ๋”๋ง์„ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์–ด
  • CAShapeLayer
    ์ขŒํ‘œ ๊ณต๊ฐ„์—์„œ cubic Bezier spline์„ ๊ทธ๋ฆฌ๋Š” ๋ ˆ์ด์–ด
  • CAGradientLayer
    ๋ฐฐ๊ฒฝ์ƒ‰์œ์— ๊ทธ๋ผ๋””์–ธํŠธ๋กœ ๋ชจ์–‘์„ ์ฑ„์šฐ๋Š” ๋ ˆ์ด์–ด
  • CAEmitterLayer
    ์ž‘์€ ์กฐ๊ฐ์„ ๋‚ด๋ฟœ๊ณ , ์›€์ง์ด๊ณ , ๋ Œ๋”๋งํ•˜๋Š” ๋ ˆ์ด์–ด
  • CAScrollLayer
    bounds๋ณด๋‹ค ํฐ ํฌ๊ธฐ์˜ ์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ ˆ์ด์–ด
  • CATiledLayer
    ์ปจํ…์ธ ์˜ ํƒ€์ผ์„ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต, ์—ฌ๋Ÿฌ ์ˆ˜์ค€์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ ˆ์ด์–ด
  • CATransformLayer
    ์ง„์งœ 3D ๋ ˆ์ด์–ด ๊ณ„์ธต์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์ด์–ด
  • CAReplicatorLayer
    ๊ธฐํ•˜, ์‹œ๊ฐ„, ์ƒ‰์ƒ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ง„ sublayer์˜ ๋ณต์‚ฌ๋ณธ์„ ๋‹ค๋Ÿ‰ ์ƒ์‚ฐํ•˜๋Š” ๋ ˆ์ด์–ด
  • CAMetalLayer
    Metal์ด ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” Core Animation ๋ ˆ์ด์–ด๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋จ

์ฐจ์ด์ 

์œ„์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ UIView๋Š” ์ปจํ…์ธ ์˜ ๋“œ๋กœ์ž‰๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ , CoreAnimation์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ธ ์˜ ์กฐ์ž‘๊ณผ ๊ด€๋ จ๋œ API๋“ค์„ ์ œ๊ณตํ•˜์ง€๋งŒ CoreAnimation์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ ์ค‘ CALayer๋Š” ์ปจํ…์ธ ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ๋น„ํŠธ๋งต์œผ๋กœ backing store์— ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ ˆ์ด์–ด์˜ ํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด Core Animation์€ ํ•ด๋‹น ๋ ˆ์ด์–ด์˜ ๋น„ํŠธ๋งต๊ณผ ์ƒํƒœ์ •๋ณด๋ฅผ GPU๋กœ ๋ณด๋‚ด๊ณ , GPU๊ฐ€ ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๋น„ํŠธ๋งต์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค(๋ Œ๋”๋ง). View์˜ draw(_:)๊ฐ€ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์˜ CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, CPU์— ๋ถ€๋‹ด์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

GPU ๐Ÿ†š CPU

  • CALayer๋Š” GPU๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU์˜ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์— ๋ถ€ํ•˜๋ฅผ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์•ฑ์˜ ๋ฐ˜์‘์„ฑ์„ ์ €ํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ๊ณ ์ฃผ์‚ฌ์œจ์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • CALayer๋Š” UIView๋ณด๋‹ค ๊ฐ€๋ณ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ํ”„๋กœํผํ‹ฐ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


UIView๋Š” CALayer์˜ delegate์ด๋‹ค

UIView๋Š” ๋ Œ๋”๋ง์„ ์œ„ํ•œ rootlayer๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–์Šต๋‹ˆ๋‹ค.

var layer: CALayer { get }

๊ทธ๋ฆฌ๊ณ  UIView๊ฐ€ layer์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธCALayerDelegate์ž…๋‹ˆ๋‹ค.

CALayerDelegate๋Š” ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


Event Handling

@MainActor class UIView : UIResponder

UIKit์˜ UIView๋Š” CALayer์™€ ๋‹ฌ๋ฆฌ UIResponder์˜ ์„œ๋ธŒํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— Responder chain๋‚ด์—์„œ ์‚ฌ์šฉ์ž ํ„ฐ์น˜ ๋˜๋Š” gesture ์ด๋ฒคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ gestureRecognizer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ common gesture๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด CALayer๋Š” ์–ด๋–จ๊นŒ์š”?
UIResponder๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ”๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆœ ์—†์ง€๋งŒ, hitTest, contains๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Layer๋‹จ์—์„œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค.


๊ธฐํƒ€ ๊ธฐ๋Šฅ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ฐจ์ด์  ์™ธ์—๋„ ๊ฐ ๊ฐ์ฒด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ถ”๊ฐ€์  ๊ธฐ๋Šฅ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • UIView

    • Accessibility ์ง€์›
    • UIMotionEffect
    • font-sizing perferences ๋“ฑ๋“ฑ
  • CALayer

    • Layer filter
    • Layer actions ๋“ฑ๋“ฑ

์ •๋ฆฌ

UIView

  • CALayer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” wrapper, ์‹ค์ œ ๋“œ๋กœ์ž‰๊ณผ ๋ Œ๋”๋ง์€ CoreAnimation์—๊ฒŒ ์œ„์ž„
  • CPU์˜ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘
  • ํ•˜๋‚˜์˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ๋กœ์„œ, ํ™”๋ฉด ์œ„์˜ ๋ ˆ์ด์•„์›ƒ, ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ API ์ œ๊ณต (์˜คํ† ๋ ˆ์ด์•„์›ƒ, anchor...)
  • UIResponder์˜ ์„œ๋ธŒํด๋ž˜์Šค, Responder Chain์— ์†ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์„ ์ง€์›

CALayer

  • ์‹ค์ œ GPU์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• 
  • ๋†’์€ frame rate๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, drawing, animation์„ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Œ (UIView๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์Œ)
  • ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ํผํฌ๋จผ์Šค๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์ž‘์—…์— ํšจ์œจ์ 
  • ์ €์ˆ˜์ค€ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฏ€๋กœ, UIView์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์„ธ๋ฐ€ํ•œ ์ปจํ…์ธ  ์ปจํŠธ๋กค์ด ๊ฐ€๋Šฅ

UIView๋Š” ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์‚ฌ์šฉ์ž์™€ ์ธํ„ฐ๋ ‰์…˜ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๊ฐํ˜•ํ‹€์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ UI Component์ด๋‹ค.
CALayer๋Š” UIView์˜ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•œ๋‹ค. ํ•˜์ง€๋งŒ CALayer๋งŒ ์‚ฌ์šฉํ•ด์„œ UI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆœ ์—†๋‹ค.

UIView์—์„œ ํ•  ์ˆ˜ ์—†๋Š” ์ด๋ฏธ์ง€๊ฐ„ ํ•ฉ์„ฑ, ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜, ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, CALayer๋กœ ๋“œ๋กœ์ž‰, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜์ž


References

์˜› ์• ํ”Œ ๊ณต์‹๋ฌธ์„œ - CoreAnimation Programming Guide
CALayer Tutorial
CALayer๋ž€
iOS) CALayer ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ
TUTORIAL A Beginnerโ€™s Guide to CALayer

profile
i๐ŸŽS ๊ฐœ๋ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€