Estimating the Height of a Table's Scrolling Area

Panther·2021년 8월 26일
0

https://developer.apple.com/documentation/uikit/views_and_controls/table_views/estimating_the_height_of_a_table_s_scrolling_area

"Provide height estimates for your table view’s headers, footers, and rows to ensure that scrolling accurately reflects the size of your content."

스크롤링이 컨텐트 크기를 정확하게 반영할 수 있도록 하기 위해 테이블 뷰의 헤더, footer, 행에 대한 높이 추정값을 제공합니다.

Overview

가능한 겨우마다 테이블 뷰는 성능 및 스크롤링 동작을 향상시키기 위해 셀, 헤더, footer에 대한 높이 추정값을 사용합니다. 테이블 뷰가 스크린에 나타나기 전에 테이블 뷰는 컨텐트 뷰의 높이를 계산해야 합니다. 왜냐하면 스크롤링 관련 파라미터를 설정하기 위해 이 정보가 필요하기 때문입니다. 아이템에 대한 추정된 높이를 제공하지 않으면 테이블 뷰는 나타나는 아이템의 실제 높이를 계산해야 하며 이는 비용이 많이 듭니다.

Important
테이블 뷰가 self-sizing 셀, 헤더, footer를 포함하는 경우 해당 아이템에 대한 추정된 높이를 제공해야 합니다.

테이블 뷰는 표준 헤더, footer, 행 스타일에 기반해 테이블 뷰 아이템에 대한 기본값 높이 추정값을 제공합니다. 테이블 아이템이 기본값보다 많이 짧거나 길면 테이블의 estimatedRowHeight, estimatedSectionHeaderHeight, estimatedSectionFooterHeight 속성에 값을 할당해서 커스텀 추정값을 제공할 수 있습니다. 개별 아이템의 높이가 서로 다르다면 딜리게이트 객체의 아래 메소드를 사용해서 커스텀 추정값을 제공해야 합니다.

  • tableView(_:estimatedHeightForRowAt:)
  • tableView(_:estimatedHeightForHeaderInSection:)
  • tableView(_:estimatedHeightForFooterInSection:)

헤더, footer, 행의 높이를 추정할 때 속도는 정확도보다 더 중요합니다. 테이블 뷰는 테이블에 있는 모든 아이템에 대한 추정값을 요청하기 때문에 딜리게이트 메소드에서 시간이 많이 걸리는 작업을 수행하지 않아야 합니다. 대신 스크롤링에 유용할 수 있는 정도에 충분히 가깝도록 추정값을 생성해야 합니다. 테이블 뷰는 아이템이 스크린에 나타날 때 추정값을 실제 아이템 높이로 대체합니다.

아래 예시 코드는 다른 높이의 테이블 행에 대한 추정된 높이를 계산합니다. 첫 번째 행에 대한 셀은 항상 텍스트의 여러 행을 포함하는 커스텀 스타일을 사용합니다. 다른 모든 행은 테이블 뷰가 제공하는 기본 스타일을 사용합니다.

let cellMarginSize :CGFloat  = 4.0
override func tableView(_ tableView: UITableView, 
         estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
   // Choose an appropriate default cell size.
   var cellSize = UITableView.automaticDimension
        
   // The first cell is always a title cell. Other cells use the Basic style.
   if indexPath.row == 0 {
      //Title cells consist of one large title row and two body text rows.
      let largeTitleFont = UIFont.preferredFont(forTextStyle: .largeTitle)
      let bodyFont = UIFont.preferredFont(forTextStyle: .body)
            
      // Get the height of a single line of text in each font.
      let largeTitleHeight = largeTitleFont.lineHeight + largeTitleFont.leading
      let bodyHeight = bodyFont.lineHeight + bodyFont.leading
            
      // Sum the line heights plus top and bottom margins to get the final height.
      let titleCellSize = largeTitleHeight + (bodyHeight * 2.0) + (cellMarginSize * 2)

      // Update the estimated cell size.
      cellSize = titleCellSize
   }
        
   return cellSize
}

테이블 뷰가 높이 추정값을 사용할 때 테이블 뷰는 스크롤 뷰로부터 상속된 contentOffsetcontentSize 속성을 관리합니다. 이 속성을 직접 읽거나 수정하는 시도는 하지 않아야 합니다. 이 값들은 UITableView에서만 의미가 있습니다.

See Also


Table Management

UITableViewController

테이블 뷰 관리에 특화된 뷰 컨트롤러입니다.

https://developer.apple.com/documentation/uikit/uitableviewcontroller
https://velog.io/@panther222128/UITableViewController

UITableViewFocusUpdateContext

하나의 뷰에서 다른 뷰로의 특정 포커스 업데이트에 관련이 있는 정보를 제공하는 컨텍스트 객체입니다.

https://developer.apple.com/documentation/uikit/uitableviewfocusupdatecontext
https://velog.io/@panther222128/UITableViewFocusUpdateContext


0개의 댓글