이걸로 지난 3 ~ 4 시간 동안 벽에 머리를 박고 있었는데 알아낼 수없는 것 같습니다. 내부에 전체 화면 UITableView가있는 UIViewController가 있고 (화면에 다른 항목이 있으므로 UITableViewController를 사용할 수 없습니다) 자동 레이아웃으로 tableHeaderView의 크기를 조정하고 싶습니다. 말할 필요도없이 그것은 협력하지 않습니다.
아래 스크린 샷을 참조하십시오.
OverviewLabel (예 : "List overview information here."텍스트)에는 동적 내용이 있기 때문에 자동 레이아웃을 사용하여 크기를 조정하고 수퍼 뷰입니다. 계층 구조의 Paralax Table View 바로 아래에있는 tableHeaderView를 제외하고는 모든 크기가 멋지게 크기 조정되었습니다.
헤더보기의 크기를 조정하는 유일한 방법은 다음 코드를 사용하는 프로그래밍 방식입니다.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
이 경우 headerFrameHeight는 다음과 같이 tableViewHeader 높이의 수동 계산입니다 (innerHeaderView는 흰색 영역이거나 두 번째 "View", headerView는 tableHeaderView 임) .
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
수동 계산은 작동하지만 나중에 상황이 변경되면 투박하고 오류가 발생하기 쉽습니다. 내가 할 수 있기를 원하는 것은 다른 곳에서 할 수 있듯이 제공된 제약 조건에 따라 tableHeaderView의 크기를 자동으로 조정하는 것입니다. 하지만 제 삶을 위해 저는 그것을 이해할 수 없습니다.
이것에 대한 여러 게시물이 있지만 명확하지 않아서 나를 더 혼란스럽게 만들었습니다. 다음은 몇 가지입니다.
translatesAutoresizingMaskIntoConstraints 속성을 NO로 변경하는 것은 실제로 의미가 없습니다. 그 이유는 저에게 오류가 발생하고 어쨌든 개념적으로 이해가되지 않기 때문입니다.
어떤 도움이라도 정말 감사하겠습니다!
편집 1 : TomSwift의 제안 덕분에 알아낼 수있었습니다. 개요의 높이를 수동으로 계산하는 대신 다음과 같이 계산 한 다음 이전과 같이 tableHeaderView를 다시 설정할 수 있습니다.
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
편집 2 : 다른 사람들이 언급했듯이 편집 1에 게시 된 솔루션이 viewDidLoad에서 작동하지 않는 것 같습니다. 그러나 viewWillLayoutSubviews에서 작동하는 것 같습니다. 아래 예제 코드 :
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}
setTableHeaderView
Xcode6에서는 작동하지 않습니다. 문제는 셀이 tableHeaderView에 의해 겹친다는 것입니다. 그러나, Xcode5에서 작동