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

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

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

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

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



답변

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

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

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

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

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


답변

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

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

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


답변

대리자에 고정 높이를 제공하지 않는 한 헤더가 높이가 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
}


답변

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

   }


답변

나는 시도했다

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

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

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

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


답변

나의 경우에는:

  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

답변

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

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

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

    return label
}