스토리보드 없이 유동적 높이를 가진 테이블 뷰 만들기

이지수·2023년 8월 27일
0

Swift학습

목록 보기
14/14

며칠간 삽질을 좀 해서.. 기록해 둔다.


1. estimatedHeightForRowAt, heightForRowAt 지정하기

tableview delegate

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 1000
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
  • heightForRowAt을 UITableView.automaticDimension 값으로 지정할 것. 셀 내용에 따라 높이를 계산해서 각 셀의 높이를 다르게 만들 수 있다.

2. custom cell 구성

custom cell

  • 발그림 양해 부탁
  • 나의 경우에는 한 셀에 자질구레한 요소들이 많이 들어가 있었다.
  • 그걸 크게 세개의 스택으로 나누고 (보라색)
  • 세개의 스택을 또하나의 밑바탕이 되는 스택으로 감쌌다. (노란색 네모)
  • 세개의 보라색 스택중 중간에는 라벨이 들어가는데 긴글이 들어간 경우 중간에 셀이 잘렸다. 밑에 캡처참고
    -긴글이 몇 줄 더 남았는데 잘린 상태로 화면에 보여짐

  • 1번에서 설정한 UITableView.automaticDimension 값이 제대로 먹히지 않음이 분명했다.
  • 오토 레이아웃 설정한 것을 싹다 다시 봤다.
    stackoverFlow 사람들이 그러길 무조건 오토레이아웃에 문제가 있는 게 100%라고들 했다.
  • 저렇게 셀이 중간에 잘리는 것은 tableview cell을 그릴 때 정확한 height를 계산할 수 없기 때문이다.
  • 그렇다고 모든 셀에 높이를 한 2000씩 줄 수도 없는 노릇이다.

3. 문제 발견!

custom cell - auto layout

  • 일단 height, top, bottom 관련으로 constraint를 greaterThanOrEqualTo로 설정된 부분들은 하나씩 다 보면서 되도록 equalTo로 바꿨다.
  • 참고로 SnapKit 사용했다. 화면에 배치해야하는 요소가 늘어나자 대가리가 터질 것 같기에 안 쓸 수가 없었다.

  • 1번 stack의 bottom은 2번 스택의 top과 상대적인 constraint가 걸릴 수 밖에 없다.
  • 2번의 bottom과 3번의 top도 마찬가지이다.
  • 주의해야 할 것은 1번의 top과 3번의 bottom이었다.

찾았다

  • 그리고 3번의 bottom을 노란색 스택 bottom과 greaterThanOrEqualTo로 constraint를 걸어놓았다. 이것이 문제였다.
  • greaterThanOrEqualTo로 하면 결국 height의 값이 모호해진다.
  • equalTo로 변경해서 해결

4. 결과

  • 안잘리고 잘 출력된다!
profile
iOS 개발자 꿈나무

0개의 댓글