자동 레이아웃을 사용하여 동적 테이블 뷰 섹션 헤더 높이를 얻을 수 있습니까?


112

iOS 8의 새로운 기능으로, 예상 행 높이를 설정하기 만하면 100 % 동적 표보기 셀을 얻은 다음 자동 레이아웃을 사용하여 셀의 요소를 레이아웃 할 수 있습니다. 콘텐츠의 높이가 증가하면 셀의 높이도 증가합니다. 이것은 매우 유용하며 테이블 뷰의 섹션 헤더에 대해 동일한 기능을 수행 할 수 있는지 궁금합니다.

예를 들어 UIViewin tableView:viewForHeaderInSection:을 만들고, UILabel하위보기를 추가하고 ,보기에 대한 레이블에 대한 자동 레이아웃 제한을 지정하고, 구현하지 않고도 레이블의 내용에 맞게보기 높이를 늘릴 수 tableView:heightForHeaderInSection:있습니까?

viewForHeaderInSection상태에 대한 문서 : "이 메서드는 tableView : heightForHeaderInSection :도 구현 된 경우에만 올바르게 작동합니다." iOS 8에서 변경된 사항이 있는지 듣지 못했습니다.

그렇게 할 수 없다면이 행동을 모방하는 가장 좋은 방법은 무엇입니까?

답변:


275

이것은 가능하다. iOS 8에서 구현 된 동적 셀 높이와 함께 바로 새로운 기능입니다.

아주 간단합니다. 이것을 추가하십시오 viewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

그런 다음 viewForHeaderInSection자동 레이아웃을 재정의 하고 사용하여보기의 요소를 적합하게 제한합니다. 그게 다야! 구현할 필요가 없습니다 heightForHeaderInSection. 그리고 실제로는 sectionHeaderHeight명시 할 필요가 없습니다. 명확성을 위해 추가했습니다.

iOS 11에서 셀 및 머리글 / 바닥 글보기는 기본적으로 예상 높이를 사용합니다. 해야 할 유일한 일은 예상되는 것을 시스템에 더 잘 알릴 수 있도록 예상 높이를 제공하는 것입니다. 기본값은 UITableViewAutomaticDimension이지만 가능한 경우 평균 높이 인 더 나은 추정치를 제공해야합니다.


3
그것이 작동한다면 멋지지만 문서는 그것을 언급하지 않으며 올바르게 기억하면 WWDC 세션도 마찬가지입니다. 문서는 UITableViewAutomaticDimension"이 상수를 tableView:heightForHeaderInSection:or tableView:heightForFooterInSection:에서 UITableView반환하면 tableView:titleForHeaderInSection:or 에서 반환 된 값에 맞는 높이를 사용합니다 tableView:titleForFooterInSection:(제목이 아닌 경우 nil)"라고 말합니다.
Aaron Brager 2015-04-21

28
이것은 나를 위해 작동하지 않았습니다. 내 섹션 헤더는 높이를 자동으로 계산할 수 있지만 섹션의 셀과 겹칩니다. xib 파일을 사용하여 헤더보기를 설정하고 인터페이스 빌더에서 제약 조건을 설정하고 있습니다. 그게 내 문제인가요? 어디에서 제약을 만들고 있습니까? 감사!
CoBrA2168

5
여기에 약속 된대로 샘플 코드가 있습니다 : github.com/ebetabox/DynamicCellSectionHeight
PakitoV

10
여기서 또 다른 요점은 테이블 셀이 섹션에서 작동하려면 자동 높이 (UITableViewAutomaticDimension) 계산을 위해 구성되어야한다는 것입니다.
Bob Spryn 2015

9
당신은 있어야합니다 estimatedSectionHeaderHeight또는 tableView:estimatedHeightForHeaderInSection:AND sectionHeaderHeighttableView:heightForHeaderInSection:. 또한 대리자 메서드를 사용하는 경우 추정값에 대해 1.00보다 큰 값을 반환해야합니다 (완전히 문서화되지 않은 동작). 그렇지 않으면 높이 대리자가 호출되지 않고 기본 테이블 뷰 헤더 높이가 사용됩니다.
Vadoff

29

이는 estimatedSectionHeaderHeight테이블보기에서 를 설정 (또는 리턴)하여 수행 할 수 있습니다 .

을 설정 한 후 섹션 헤더가 셀과 겹치는 경우을estimatedSectionHeaderHeight 사용하고 있는지 확인하세요 estimatedRowHeight.

(두 번째 단락에는 일부가 놓칠 수있는 모든 주석을 읽은 후 찾을 수있는 문제에 대한 답변이 포함되어 있기 때문에이 답변을 추가합니다.)


1
감사합니다, 설정 후 estimatedRowHeight: 마법처럼이 작품을
SZ ashik

1
행에 UITableViewAutomaticDimension을 사용하지 않는 경우에도 마찬가지입니다. 한 시간을 절약 해주셔서 감사합니다.
Ryan Romanchuk

14

대리자에 고정 높이를 제공하지 않는 한 헤더가 높이가 0이 될 때까지 동일한 문제가 발생했습니다 heighForHeaderInSection.

다음을 포함하는 많은 솔루션을 시도했습니다.

self.tableView.sectionHeaderHeight = UITableView.automaticDimension
self.tableView.estimatedSectionHeaderHeight = 73

그러나 아무것도 작동하지 않았습니다. 내 셀도 적절한 자동 레이아웃을 사용하고있었습니다. 행은 다음 코드를 사용하여 동적으로 높이를 변경했지만 섹션 헤더는 변경되지 않았습니다.

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableView.automaticDimension

수정도 매우 간단하고 이상한하지만 난 대신 1 개 라인 코드의 대리자 메서드를 구현했다 estimatedSectionHeaderHeight하고 sectionHeaderHeight있는가는이 같은 내 경우에 다음과 같습니다.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    73
}

11

Swift 4+

작동 (100 % 테스트)

콘텐츠에 따라 동적 높이가있는 행과 섹션이 모두 필요한 경우 아래 코드를 사용할 수 있습니다.

viewDidLoad ()에서 다음 줄을 작성하십시오.

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

이제 UITableView Delegate 메서드를 사용하여 행 높이와 섹션 높이를 설정했습니다.

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }

이 훌륭한 답변에 유의하십시오 . 2020 년 에는 viewDidLoad에서 4 개의 속성 만 사용하는 것이 괜찮은 것 같습니다.
Fattie

이 훌륭한 답변에 유의하십시오 . 2020 년 에는 예상 높이 (예 : 20 개 정도)를 제공하는 두 개의 "쓸모없는"선이 필요합니다.
Fattie

6

나는 시도했다

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

그러나 여러 줄 레이블로 헤더 크기가 올바르게 조정되지 않았습니다. 내 문제를 해결하기 위해 이것을 추가했습니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}

데이터 소스 함수를 정의 할 tableView:estimatedHeightForHeaderInSectiontableView:heightForHeaderInSection대신의 viewDidLoad에서 정의.
키스 예오

estimatedSectionHeaderHeightiOS 11 아래에서만 설정 이 필요 하다는 것을 알았습니다
doctorBroctor

1

나의 경우에는:

  1. 프로그래밍 방식으로 설정이 작동하지 않습니다 .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. 스토리 보드에서 설정이 작동하지 않습니다 .

  2. 오버라이드가 heightForHeaderInSection 작동했습니다 .

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

테스트 환경 :

  • 맥 OS 10.13.4
  • XCode 버전 9.4.1
  • 시뮬레이터 iPhone 8 Plus

0

예, 저에게 효과적입니다. 다음과 같이 더 많이 변경해야합니다.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}

-2

iuriimoz 답변을 수정 했습니다 . 방금 viewWillAppear 메서드를 바꿨습니다.

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

또한 tableView.layoutIfNeeded ()를

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

iOS 10의 경우

tableView.beginUpdates()
tableView.endUpdates()

나를 위해 viewWillAppear에 "페이드"애니메이션 효과가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.