반응형
문제 정의
환율 계산기 앱을 만들던 중 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를 설정한 적이 없어 원인을 분석해봤다.
원인 분석
- UITableViewCell의 contentView는 시스템이 제약을 관리한다
- contentView.translatesAutoresizingMaskIntoConstraints = false를 명시적으로 설정하면 안 된다.
- contentView에 직접 top/bottom/height 제약을 추가하는 것도 충돌을 일으킨다.
- 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로 설정 |
참고
반응형
'iOS > UIKit' 카테고리의 다른 글
[UIKit] ViewController의 개념과 생명주기 정리 (0) | 2025.04.14 |
---|---|
[ UIKit ] SwiftUI만 공부하던 내가 UIKit MVVM에서 클로저를 처음 마주쳤을 때 (0) | 2025.04.09 |
[ UIKit ] Combine으로 상태를 바인딩하는 방법 (0) | 2025.04.06 |
[ UIKit ] Delegate 패턴 알아보기 (0) | 2025.04.06 |
[ UIKit ] UISlider (20) | 2024.02.03 |