[ios] UITableView 셀의 동적 높이 문제 (Swift)

가변 길이의 동적 텍스트가 tableview 셀 레이블에 삽입됩니다. tableview 셀의 높이를 동적으로 크기 조정하기 위해 다음을 구현했습니다 viewDidLoad().

self.tableView.estimatedRowHeight = 88.0
self.tableView.rowHeight = UITableViewAutomaticDimension

이것은 아직 스크롤되지 않은 UITableViewAutomaticDimention셀 (셀로 스크롤 할 때 호출 됨)에 대해 잘 작동 하지만 데이터가있는 테이블을로드 할 때 처음 화면에 렌더링되는 셀에는 적합하지 않습니다.

(다른 많은 리소스에서 제안한대로) 단순히 데이터를 다시로드 해 보았습니다.

self.tableView.reloadData()

viewDidAppear()그리고 둘 다 viewWillAppear()소용이 없었습니다. 나는 길을 잃었다 .. 누구든지 xcode가 화면에 처음로드 된 셀의 동적 높이를 렌더링하는 방법을 알고 있습니까?

더 나은 대체 방법이 있으면 알려주세요.



답변

이 시도:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

편집하다

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

스위프트 4

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

스위프트 4.2

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

두 방법 모두 위에 정의하십시오.
문제를 해결합니다.

PS :이 작업을 수행하려면 위쪽 및 아래쪽 제약 조건이 필요합니다.

여기에 예가 있습니다


답변

이것을 사용하십시오 :

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300

사용하지 마십시오 : heightForRowAtIndexPath델리게이트 함수

또한 스토리 보드에서 많은 양의 데이터가 포함 된 레이블의 높이를 설정하지 마십시오. top, bottom, leading, trailing제약을 주세요 .


답변

SWIFT 3

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 160

과!!! StoryBoard에서 : 레이블에 대해 TOP 및 BOTTOM 제약 조건을 설정해야합니다. 다른 건 없습니다.


답변

이 이상한 버그는 다른 답변으로 문제가 해결되지 않았기 때문에 Interface Builder 매개 변수를 통해 해결되었습니다.

내가 한 것은 기본 레이블 크기를 잠재적으로 콘텐츠가 될 수있는 것보다 크게 만들고 estimatedRowHeight높이에도 반영되도록하는 것뿐 이었습니다. 이전에는 Interface Builder에서 기본 행 높이를로 설정하고 88px컨트롤러에 반영했습니다 viewDidLoad().

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 88.0

그러나 그것은 작동하지 않았습니다. 그래서 콘텐츠가 어쩌면 더 커지지 않을 것이라는 것을 깨달았 100px으므로 기본 셀 높이를 108px(잠재적 콘텐츠보다 큼)으로 설정하고 컨트롤러에 그렇게 반영했습니다 viewDidLoad().

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 108.0

이것은 실제로 코드가 초기 레이블을 올바른 크기 로 축소 할 수있게했습니다 . 즉, 결코 더 큰 크기로 밖으로 확장 없지만, 항상 또한, 추가가 … 아래로 축소 할 수 self.tableView.reloadData()필요하지 않았다 viewWillAppear().

나는 이것이 매우 가변적 인 콘텐츠 크기를 다루지 않는다는 것을 알고 있지만 콘텐츠가 가능한 최대 문자 수를 갖는 내 상황에서 작동했습니다.

이것이 Swift 또는 Interface Builder의 버그인지 확실하지 않지만 매력처럼 작동합니다. 시도 해봐!


답변

행 높이 및 예상 행 높이에 대한 자동 치수를 설정하고 다음 단계를 확인하십시오.

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Set automatic dimensions for row height
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension

}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Swift 4.2 onwards
    return UITableView.automaticDimension

    // Swift 4.1 and below
    return UITableViewAutomaticDimension
}

예를 들어 : UITableviewCell에 레이블이있는 경우

  • 줄 수 설정 = 0 (& 줄 바꿈 모드 = 꼬리 자르기)
  • 수퍼 뷰 / 셀 컨테이너에 대한 모든 제약 (위, 아래, 오른쪽 왼쪽)을 설정합니다.
  • 선택 사항 : 데이터가 없더라도 라벨로 덮는 최소 세로 영역을 원하는 경우 라벨의 최소 높이를 설정합니다.

다음은 동적 높이 제약이있는 샘플 라벨입니다.

여기에 이미지 설명 입력


답변

UITableView의 동적 크기 조정 셀에는 2 가지가 필요합니다.

  1. 테이블 뷰 셀 내에서 뷰의 올바른 제약 조건 설정 (대부분 뷰에 적절한 top, bottom 및 traling 제약 조건을 제공하는 것이 포함됨)
  2. viewDidLoad ()에서 TableView의 이러한 속성 호출

     tableView.rowHeight = UITableViewAutomaticDimension
    
     tableView.estimatedRowHeight = 140
    

이것은 swift 3로 작성된 자체 크기 조정 (동적 테이블 뷰 셀)에 대한 멋진 튜토리얼입니다.


답변

Swift 3의 경우 다음을 사용할 수 있습니다.

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}