iOS8의 Tableviews : Automatic Row Heights의 환상적인 새로운 기능의 부작용이 있습니다.
iOS 7에서는 고정 된 크기의 행 (로 설정 tableView.rowHeight
)이 있거나 셀의 높이를 계산하는 코드를 작성하여 tableView:heightForRowAtIndexPath
. 셀에 많은 뷰가 있고 다른 글꼴 크기에서 고려할 높이가 다른 경우 셀 높이 계산을위한 코드를 작성하는 것은 매우 복잡 할 수 있습니다. Dynamic Type을 추가하고 프로세스는 엉덩이에 고통이었습니다.
iOS 8에서도 위의 작업을 수행 할 수 있지만 이제는 자동 레이아웃을 사용하여 셀의 콘텐츠를 구성한 경우 iOS에서 행 높이를 결정할 수 있습니다. 동적 글꼴 크기가 변경되거나 사용자가 접근성 설정을 사용하여 텍스트 크기를 수정하면 UI가 새로운 크기에 적응할 수 있기 때문에 이는 개발자에게 큰 이점입니다. 또한 여러 행의 텍스트를 포함 할 수있는 UILabel이있는 경우 이제 셀이 필요할 때이를 수용하도록 셀을 확장 할 수 있고 그렇지 않을 때 축소 할 수 있으므로 불필요한 공백이 없습니다.
표시되는 경고 메시지는 자동 레이아웃에 대한 셀의 제약 조건이 충분하지 않아 테이블 뷰에 셀 높이를 알리는 것입니다.
다른 포스터에서 이미 언급 한 기술과 함께이 메시지를 제거하는 동적 셀 높이를 사용하려면 셀에 UI 항목을 셀 의 상단 과 하단 에 바인딩하기에 충분한 제약 조건이 있는지 확인해야합니다 . 이전에 자동 레이아웃을 사용한 적이 있다면 Top + Leading 제약 조건을 설정하는 데 익숙 할 것입니다.하지만 동적 행 높이에도 아래쪽 제약 조건이 필요합니다.
레이아웃 단계는 다음과 같이 작동하며, 화면에 셀이 적시에 표시되기 직전에 발생합니다.
고유 크기가있는 콘텐츠의 크기가 계산됩니다. 여기에는 UILabels 및 UIImageViews가 포함되며, 여기에서 크기는 각각 포함 된 텍스트 또는 UIImage를 기반으로합니다. 이 두 뷰는 모두 너비를 알려진 것으로 간주합니다 (후행 / 선행 가장자리에 대한 제약 조건을 설정했거나 명시 적 너비를 설정했거나 결국 가로 제한을 사용하여 좌우로 너비를 표시했기 때문). 레이블에 텍스트 단락이 있다고 가정 해 보겠습니다 ( "줄 수"가 0으로 설정되어 자동 줄 바꿈 됨). 310 포인트 만 가능하므로 현재 글꼴 크기에서 120pt 높이로 결정됩니다.
UI는 위치 제약에 따라 배치됩니다. 셀의 아래쪽 여백에 연결되는 레이블 아래쪽에 제약 조건이 있습니다. 레이블이 120 포인트 높이로 성장하고 제약 조건에 의해 셀의 맨 아래에 바인딩되었으므로 "bottom of"라는 제약 조건을 충족하려면 셀을 "아래로"(셀 높이 증가) 밀어야합니다. 레이블은 항상 셀 하단에서 표준 거리입니다.
보고 한 오류 메시지는 아래쪽 제약 조건이 누락 된 경우 발생합니다.이 경우 셀 맨 아래를 셀 맨 위에서 "밀어 낼"것이 없습니다. 이는보고 된 모호성입니다. 맨 아래를 밀지 않습니다. 상단, 셀이 무너집니다. 그러나 자동 레이아웃도이를 감지하고 표준 행 높이를 사용하는 방식으로 돌아갑니다.
가치가 있고 대부분 반올림 된 답변을 얻으려면 iOS 8의 자동 레이아웃 기반 동적 행 높이를 구현하는 경우 tableView:estimatedHeightForRowAtIndexPath:
. 이 추정 방법은 셀에 대한 대략적인 값을 사용할 수 있으며 테이블보기가 처음로드 될 때 호출됩니다. UIKit이 스크롤바와 같은 것을 그리는 데 도움이되는데, 이는 tableview가 스크롤 할 수있는 콘텐츠의 양을 알지 못하면 그릴 수 없지만 스크롤바 일 뿐이므로 완전히 정확한 크기는 필요하지 않습니다. 이렇게하면 셀이 필요한 순간까지 실제 행 높이의 계산을 연기 할 수 있습니다. 이렇게하면 계산 집약적이지 않고 UITableView가 더 빨리 표시됩니다.