์๋ ํ์ธ์~ ๋ฆด๋ฆฌ์ด์ ๋๋ค๐
์ค๋์ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฒ ๊ฐ์ง๋ง, ๋ค๋ฅธ 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
์๋ ๋ค์ํ ์ข
๋ฅ์ ์๋ธํด๋์ค๊ฐ ์์ต๋๋ค.
CATextLayer
CAShapeLayer
CAGradientLayer
CAEmitterLayer
CAScrollLayer
CATiledLayer
CATransformLayer
CAReplicatorLayer
CAMetalLayer
์์์ ์ ๊น ์ธ๊ธํ ๊ฒ์ฒ๋ผ 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