iOS Trouble Shooting

[iOS] UITableView에서 리로드할 때 스크롤 포지션 어긋나는 이슈

devharrry 2020. 1. 5. 01:37

해당 이슈는 UITableView의 셀 높이들이 동적일 때 리로드할 때 스크롤 위치가 이상한 곳으로 설정되어집니다.
유연하고 부드러운 테이블뷰를 만들기 위해서는 heightForRowAt, estimatedHeightForRowAt 모두 적절히 지정되어야합니다.

 

estimatedHeightForRowAt를 잘 지정해줘야 리로드할 때 예상한 셀 높이에 따라 스크롤 포지션이 정해집니다.

 

해결 방법

셀 높이를 저장할 프로퍼티를 추가하여 willDisplay에서 셀 높이를 저장하고, estimatedHeightForRowAt에서 저장한 셀 높이를 반환하여 해결.

// MARK: - Property
private var cellHeights: [IndexPath: CGFloat] = [:]

// MARK: - willDisplay
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
      self.cellHeights[indexPath] = cell.frame.size.height
}

// MARK: - estimatedHeightForRowAt
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = self.cellHeights[indexPath] {
          return height
    }
    return UITableView.automaticDimension
}