2014-05-09 3 views
0

셀의 contentView에 하위 뷰를 추가하여 사용자 지정 UITableViewCell을 디자인했으며 contentView와 하위 뷰 사이에 자동 레이아웃 제약 조건을 추가했습니다.UITableView의 NSAutoresizingMaskLayoutLayoutConstraint를 제거하는 방법?

그러나 응용 프로그램을 디버깅 할 때 Xcode에서 제약 조건 충돌이 있음을 알립니다. 제약 조건 목록에는 셀 높이를 43으로 제한하는 NSAutoresizingMaskLayoutLayoutConstraint가 하나 있습니다. 따라서 Xcode는 내 하위 뷰 높이의 제약 조건을 깨고 '압축'합니다.

이 나는 ​​시도했다 :

인터페이스 빌더에서
  1. 는 "autoreize의 파단"체크 상자를 선택 취소합니다. 작동하지 않습니다.

  2. 코드에서 cell.contentView.translatesAutoResizingMaskIntoConstraints = NO. 이로 인해 응용 프로그램이 중단되고 "자동 레이아웃은 -layoutSubviews를 실행 한 후에도 필요합니다."라는 예외가 발생합니다. 나는이 질문에서 모든 제안 된 해결책을 시도했다 : "Auto Layout still required after executing -layoutSubviews" with UITableViewCell subclass 그들 중 누구도 나를 위해 일하지 않는다.

그래서 저는 셀이 자동 크기 조정 작업을 수행하고 코드에서 자동 크기 조정 제약 조건을 제거 할 수 있다고 생각합니다. 물건을 깨지 않고 어떻게해야합니까?

EDIT : 또는 다른 관점에서 tableViewCell 높이를 유연하게 만들 수있는 방법 (하위 뷰 높이 및 제한 조건이 변경됨) IB에서는 높이를 설정해야합니다. 맞습니까?

+0

일부 레이아웃 충돌이 있어야합니다. 샘플 프로젝트를 만들고 우리와 공유하십시오. 그렇다면 그것을 쉽게 알아낼 수 있습니다. 자동 레이아웃을 사용하여 동적 셀 높이를 만드는 방법을 알고 싶다면 여기에서 공유 할 수있는 샘플 프로젝트를 만들었습니다. – Subramanian

답변

1

당신은 당신이 수동으로 예 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

에 높이이 지루한을 계산해야하는 자동 레이아웃에서 UITableViewCells의 유연한 높이를 얻기 위해 cell.contentView.translatesAutoResizingMaskIntoConstraints = NO

을 설정할 필요가 없습니다 만, 다른이 없다 방법. 당신이있는 UITableViewCell에 두 가지 조건을 충족 할 필요가 자동으로 높이를 계산하려면 :

  1. 당신은 당신의 파단이 translatesAutoResizingMaskIntoConstraints=NO
  2. 휴대 서브 뷰의 제약 가있는 UITableViewCell의 위쪽과 아래쪽 가장자리에 밀어해야이 있는지 확인해야합니다 .

그런 다음 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath에서 특정 indexPath에 해당 셀을 다시 만들고 해당 셀의 높이를 수동으로 계산해야합니다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath 
*)indexPath 
{ 

//Configure cell subviews and constraints 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
[self configureCell:cell forIndexPath:indexPath]; 

//Trigger a layout pass on the cell so that it will resolve all the constraints. 
[cell setNeedsLayout]; 
[cell layoutIfNeeded]; 

//Compute the correct size of the cell and get the height. This is where the magic happens. 
CGFloat height = [cartItemCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 
    height += 1.0f 

return height; 

} 

systemLayoutSizeFittingSize은 UITextViews와 관련이 없습니다. 이 경우 다른 방법을 사용하여 수동으로 전체 셀의 높이를 계산해야합니다. 또한 indexPath 당 높이를 캐싱하여 수행 할 수있는 성능 최적화가 있습니다.

이 블로그 게시물에는 수행 할 작업에 대한 자세한 설명이 있지만 위에서 언급 한 요지는 본질적입니다. : http://johnszumski.com/blog/auto-layout-for-table-view-cells-with-dynamic-heights

+0

감사합니다. 내 문제는 인터페이스 빌더를 사용하여 하위보기를 레이아웃했다는 것입니다. 그리고 IB는 기본적으로 셀의 고정 높이를 정의합니다.이 높이는 레이아웃 제약으로 변환되어 충돌을 일으 킵니다. 그래서 당신의 제안은 .xib 파일을 드롭하고 서브 뷰 레이아웃을위한 코드를 작성하는 것입니다. – NeoWang

+0

또는 인터페이스 작성기에서 고정 높이의 셀을 제거하는 방법이 있습니까? 코드로보기를 배치하는 것은 많은 마진 제한이 있으므로 매우 지루한 말입니다. – NeoWang

+0

실제로 tableView : heightForRowAtIndexPath를 구현하기 위해 IB를 삭제할 필요는 없습니다. UITableViewDelegate (가장 가능성있는 UITableViewController)의 코드에서 tableView : heightForRowAtIndexPath를 구현하는 한 계속 셀 행의 높이를 변경할 수 있습니다. 제약 조건이 이미 설정된 경우에는 셀 (UILabel 등)에 필요한 내용을 추가하여 확장하고 systemLayoutSizeFittingSize를 호출하여 셀을 구성 할 수 있습니다. –

1

자동 레이아웃으로 동적 테이블 뷰 셀 높이에 대한 샘플 코드를 만들었습니다. 다음 링크를 사용하여 프로젝트를 다운로드 할 수 있습니다.

DynamicTableViewCellHeight

은 내가 당신을 도울 바랍니다.

+0

도움 주셔서 감사합니다! 나는 코드를 다운로드 할 것이다. – NeoWang

관련 문제