iOS/UIKit

[ UIKit ] UITableViewCell에서 AutoLayout 충돌 이슈 해결

Sheep1sik 2025. 4. 16. 16:19
반응형

문제 정의

환율 계산기 앱을 만들던 중 UITableViewCell에서 다음과 같은 오류 로그가 반복 출력됐다

Changing the translatesAutoresizingMaskIntoConstraints property of the contentView of a UITableViewCell is not supported and will result in undefined behavior...
Unable to simultaneously satisfy constraints.
Will attempt to recover by breaking constraint...


이 오류는
contentView에 명시적으로 제약을 주거나 translatesAutoresizingMaskIntoConstraints = false를 설정할 경우,UIKit이 내부적으로 관리하는 셀 높이(UIView-Encapsulated-Layout-Height)와 충돌하면서 발생한다고 한다.

하지만, translatesAutoresizingMaskIntoConstraints = false를 설정한 적이 없어 원인을 분석해봤다.


원인 분석

  1. UITableViewCell의 contentView는 시스템이 제약을 관리한다
    • contentView.translatesAutoresizingMaskIntoConstraints = false를 명시적으로 설정하면 안 된다.
    • contentView에 직접 top/bottom/height 제약을 추가하는 것도 충돌을 일으킨다.
  2. UITableView는 셀의 높이를 내부적으로 계산
    • 따라서 셀 높이를 60으로 고정하는 contentView.height == 60과 같은 제약은 충돌을 일으킬 수 있다.
    • 시스템은 자체적으로 높이(예: 44 또는 60.333 등)를 지정하며, 외부 고정 제약과 동시에 존재할 수 없다.

내 원인은 ontentView에 직접 top/bottom/height 제약을 추가한 것과 셀 높이를 60으로 고정하는 contentView.height == 60과 같은 제약이 해당 오류를 나오게 한 것 같다.

문제 코드

// contentView에 직접 top/bottom/height 제약을 추가해 시스템 제약과 충돌
contentView.snp.makeConstraints { make in
    make.top.equalToSuperview()
    make.bottom.equalToSuperview()
    make.height.equalTo(60) 
}

수정 코드

let tableView: UITableView = {
        let tableView = UITableView()
        tableView.separatorStyle = .singleLine
        tableView.rowHeight = 60
        tableView.register(CurrencyCell.self, forCellReuseIdentifier: "CurrencyCell")
        return tableView
    }()

 

문제 코드를 지운 후 TableView 안에 rowHeight 를 통해 각 셀의 높이를 60으로 설정했다.
이렇게 설정하게 되면 UITableView는 모든 셀의 높이를 UIView-Encapsulated-Layout-Height == 60으로 자동 설정하게 된다.


정리

항목 설명
오류 메시지 translatesAutoresizingMaskIntoConstraints 강제 변경 및 높이 충돌
핵심 원인 contentView의 제약은 시스템이 관리함
잘못된 예시 contentView.height.equalTo(60) 설정 + contentView에 직접 top/bottom/height 제약을 추가
해결 방법 contentView top/bottom/height 제약 코드 제거, 셀 높이는 rowHeight로 설정

참고

반응형