UIKit에서 제일 많이 쓰이는 객체를 하나 꼽으라면 UIView를 이야기할 수 있을 것이다.
이 UIView에서 배경색을 지정하려면 보통 backgroundColor 속성에 UIColor 객체를 할당함으로써 구현하게 된다.
let view = UIView()
view.backgroundColor = UIColor.red
그런데 사실 view 에서 배경색을 그리는 것은 UIView 객체가 아니라 layer(CALayer) 객체에서 담당하게 된다.
근데 그러면 왜 view에 backgroundColor 라는 속성이 있는 거지?
사실 이 backgroundColor에 값을 할당해 주면, layer의 backgroundColor에도 값이 할당된다!
그래서 view의 backgroundColor에 값을 할당하고 layer의 backgroundColor를 print해서 확인해 보면, CGColor 값이 출력되는 것을 확인할 수 있다.
let view = UIView()
view.backgroundColor = .red
print(view.layer.backgroundColor) // Optional(<CGColor 0x101a46640> [<CGColorSpace 0x101a44180> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)] ( 0 0.478431 1 1 ))
그런데, UIView를 상속한 UILabel에서는 약간 다르게 나타나는 걸 알 수가 있는데,
UILabel의 backgroundColor에 값을 할당해도 layer의 backgroundColor를 print해 보면 nil이 출력된다.
....????
backgroundColor에 값을 할당하면 그게 layer의 backgroundColor가 되는 거 아니었나??
label은 아닌가보다...
근데 디스플레이에 색이 반영이 되는 걸로 보아 어떤 layer에 색이 입혀지는 것 같긴 한데...
그러던 와중에 흥미로운 사실을 하나 발견했는데,
UILabel의 backgroundColor에 값을 할당하고 layer.cornerRadius 에 값을 주었을 때에도, 코너가 여전히 깎이지 않고 반영이 안 된 것을 확인할 수 있다.
실제로 UILabel 객체 자체를 출력해 보면, layer 가 CALayer가 아닌 _UILabelLayer 타입인 것을 확인할 수 있다.
let label = UILabel
label.backgroundColor = .green
print(label)<
UILabel: 0x101bb4a80;
frame = (0 366.667; 190 153);
userInteractionEnabled = NO;
backgroundColor = UIExtendedGrayColorSpace 0 0;
layer = <_UILabelLayer: 0x1019b9f10> ->CALayer가 아니라 _UILabelLayer
>
아마도 UILabel 에서 내부적으로 최적화를 위해 기존의 레이어를 override하거나 확장하여 label만의 레이어를 사용하는 것 같다.
아마 비트맵으로 캐싱하는 것과 연관이 있을 지도..?
그러면 곡률 반경은 어떻게 설정하나!!
간단하다 -> clipsToBounds = true
단, 다른 view 종류인 UIView, UIButton, UIScrollView 등은 clipsToBounds = true 를 적지 않아도 곡률 반경이 적용되는 것을 확인할 수 있다.