멋있게걷는방법

[Swift] Override함수에서 Super는 필수일까? (with. layoutSubViews) 본문

iOS

[Swift] Override함수에서 Super는 필수일까? (with. layoutSubViews)

도현D 2023. 7. 2. 02:28

기본적으로 super 키워드는 상위 뷰를 호출합니다.

 

예를 들어볼게요.

class A: UITableViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()
	}
}

만약 제가 UITableViewCell을 상속하고 있는 A라는 클래스에 있는 layoutSubview override 함수에서 super를 통해 super.layoutSubviews()를 호출했다면 어떤 뷰가 실행될까요?

 

super는 상위 뷰를 호출한다고 했죠?
현재 상속 중인 클래스는 UITableViewCell입니다.
그럼 호출되는 건 UITableView의 상위 뷰인 UIView의 layoutSubviews가 호출되겠죠!

 

super 가 뭘 하는 녀석인 줄은 알고 있었지만 이렇게 자세히 파본건 처음입니다..

 

여기서부턴 제 경험에 대한 얘기입니다.

이렇게 글을 쓰게 된 이유는 프로젝트를 하면서 contentView의 inset을 변경해야 하는 일이 있었습니다.

 

대부분 아래와 같은 코드로 변경하셨을 겁니다!

    override func layoutSubviews() {
        super.layoutSubviews()
        contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 0, left: 15, bottom: 16, right: 15))
    }

저는.. super.layoutSubviews()를 적지 않아서 며칠 동안 고생했습니다..

하지만 오히려 문제를 분석해 볼 수 있었습니다.

 

 

먼저 문제는 TableViewCell을 만질 때마다 cell 이 움직이는 문제가 있었습니다.

Simulator_Screen_Recording_-_iPhone_14_Pro_-_2023-06-30_at_12.19.22 (1).mp4
3.49MB

    override func layoutSubviews() {
        contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 0, left: 15, bottom: 16, right: 15))
    }

제 코드는 super를 통해 상위 뷰를 호출하지 않은 위와 같은 코드였습니다.

 

 

원인은 이러했습니다.

layoutSubviews는 layout이 변경될 때마다 호출되는데
제가 아까 `cell을 만질 때마다`라고 했던 말은  cell을 스와이프 하거나 등의 동작을 얘기합니다.

 

즉. contentView에 inset을 계속해서 더해준 거죠.. 아래는 contentView.frame입니다.

 

 

이렇게 해결했습니다.

여기서 super의 개념을 적용시켰습니다.

먼저 layoutSubviews는 공식 문서에 의하면 이러한 일을 합니다.

the default implementation uses any constraints you have set to determine the size and position of any subviews.

- 기본 구현에서는 사용자가 설정한 제약 조건을 사용하여 하위 보기의 크기와 위치를 결정합니다.

 

그니까. super.layoutSubviews()를 호출하고 -> content inset을 변경해 주면,

 

기본적으로 설정했던 layout으로 초기화되고 -> content inset 이 변경된다!

 

라고 이해했습니다.

 

아래는 문제를 해결한 후 contentView.frame입니다.

 

혹시나 틀린 부분이 있다면 알려주세요!! 제발 🔥


마무리.

 

많은 삽질을 했지만, 결국은 기본적인 실수였고, 하지만 그 과정에서 오늘도 배운 점이 있었습니다. 

발생한 이슈를 근본적 원인을 찾고 분석하면서 해결해 나가는 과정은 늘 새롭고 재밌는 것 같습니다.

 

이런 과정들이 쌓인다면 분명 좋은 개발자가 될 수 있지 않을까 기대해 봅니다.

 

읽어주셔서 감사합니다.🙇🏻