[UIKit] UILabel의 backgroundColor는 약간 다르다.

성실한 베짱이·2025년 7월 4일

UIKit에서 제일 많이 쓰이는 객체를 하나 꼽으라면 UIView를 이야기할 수 있을 것이다.
UIView에서 배경색을 지정하려면 보통 backgroundColor 속성에 UIColor 객체를 할당함으로써 구현하게 된다.

let view = UIView()
view.backgroundColor = UIColor.red

그런데 사실 view 에서 배경색을 그리는 것은 UIView 객체가 아니라 layer(CALayer) 객체에서 담당하게 된다.
근데 그러면 왜 viewbackgroundColor 라는 속성이 있는 거지?
사실 이 backgroundColor에 값을 할당해 주면, layerbackgroundColor에도 값이 할당된다!

그래서 viewbackgroundColor에 값을 할당하고 layerbackgroundColor를 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에서는 약간 다르게 나타나는 걸 알 수가 있는데,
UILabelbackgroundColor에 값을 할당해도 layerbackgroundColor를 print해 보면 nil이 출력된다.

....????

backgroundColor에 값을 할당하면 그게 layerbackgroundColor가 되는 거 아니었나??

label은 아닌가보다...
근데 디스플레이에 색이 반영이 되는 걸로 보아 어떤 layer에 색이 입혀지는 것 같긴 한데...

그러던 와중에 흥미로운 사실을 하나 발견했는데,
UILabelbackgroundColor에 값을 할당하고 layer.cornerRadius 에 값을 주었을 때에도, 코너가 여전히 깎이지 않고 반영이 안 된 것을 확인할 수 있다.

🔗 위 이미지의 Github Repository

실제로 UILabel 객체 자체를 출력해 보면, layerCALayer가 아닌 _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 를 적지 않아도 곡률 반경이 적용되는 것을 확인할 수 있다.

profile
print("Hello, Swift!")

0개의 댓글