[UIKit] 트러블슈팅 - UIView 생애주기

팔랑이·2025년 11월 15일

iOS/Swift

목록 보기
79/84

UIView에서 CAGradientLayer가 적용되지 않는 이슈

UIView 안에서 아래 코드를 init 시점에 실행했는데 배경으로 그라데이션이 보이지 않았다.

let gradientLayer = CAGradientLayer()
gradientLayer.frame = self.bounds
gradientLayer.colors = [UIColor.white.cgColor, UIColor.orange50.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
layer.addSublayer(gradientLayer)

원인은 UIView의 init 시점에서는 bounds가 아직 0으로 결정되어 있기 때문이다.
그래서 gradientLayer가 0×0 frame으로 추가되어 화면에 보이지 않았다.

해결 방법

layoutSubviews()를 override해서 그 시점에 layer의 frame을 업데이트한다.

override func layoutSubviews() {
    super.layoutSubviews()
    gradientLayer.frame = bounds
}

UIKit 구조상, UIView는 init → constraint 적용 → layoutSubviews() 순서로 크기가 결정되기 때문에
그라데이션처럼 frame이 필요한 작업은 layoutSubviews()에서 처리해야 한다.

느낀점

UIViewController에서는 잘 작동하던 코드를 UIView에 그대로 넣었더니 전혀 적용되지 않아 당황했는데, 이유를 알고 나니 정말 기본적인 부분이었다.
UIView의 init 시점에는 bounds가 아직 결정되지 않기 때문에, 레이아웃 기반 작업은 반드시 layoutSubviews() 이후에 해야 한다는 당연한 사실을 내가 놓치고 있었던 것.

생애주기를 제대로 이해하지 않은 채 “왜 안되지?”만 반복하고 있었던 게 조금 민망했지만, 이번에 확실히 정리하는 계기가 되었다.
앞으로는 UIView도 마찬가지로 레이아웃이 잡히는 흐름을 고려해서 작성해야겠다고 생각했음

또한 필요한 경우 layer에 직접 sublayer를 추가해서 원하는 UI를 구성할 수 있다는 점도 새롭게 정리할 수 있었던 좋은 경험이었다!

profile
정체되지 않는 성장

0개의 댓글