2017-05-18 1 views
2

내 셀 레이아웃의 낮은 품질의 모형에 맞게 정적 테이블 뷰 셀 높이를 성장 이 셀은 두 가지 뷰입니다. 하단보기에는 고정 높이가 40입니다. 상단보기에는 상단 여백에 정렬하고 하단보기에 수직으로 정렬하는 레이아웃 제약 조건이 있습니다. 평면도 내부 자동으로 라벨 내용 높이 여기

는 라벨 (청색) 및 버튼 (황색)

라벨은 또한 볼의 상단에 정렬하고 뷰의 바닥으로 정렬하는 제약을 갖고있다. 그 레이아웃과 제약의 배경은 예를 들어 셀의 높이를 100으로 늘리면 아래쪽 뷰의 높이가 40이고 위쪽 뷰와 레이블의 높이가 60 높이로 확장됩니다.

내 레이블 줄 바꿈 단어 줄 바꿈 및 줄 수를 0으로 설정했습니다. 이제 원하는 것은 자동으로 셀의 크기를 조정하여 둘 이상의 줄이있을 때 레이블의 전체 내용이 표시되도록하는 것입니다. 내가 정확히 그것을 어떻게 할 수 있니?

나는 노력이 작동하지 않습니다

self.tableView.rowHeight = UITableViewAutomaticDimension; 
self.tableView.estimatedRowHeight = 80.0; 

. 셀 높이는 항상 UILabel의 줄 간격과는 별개로 80 개입니다.

는 또한 시도 :

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

내 첫 번째 방법은 같은 결과로.

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    let heightLabel = self.heightForView(text: self.lblTitle.text!, font: UIFont(name: "Helvetica Neue", size: 18)!, width: self.lblTime.width); 
    let heightView = (heightLabel + (80.0/2)); 

    print("title label height \(heightLabel)"); 
    print("title view height \(heightView)"); 

    if (heightView > 80.0) { 
     return heightView; 
    } 

    return 80.0; 
} 

func heightForView(text: String, font: UIFont, width: CGFloat) -> CGFloat { 
    let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude)); 
    label.numberOfLines = 0; 
    label.lineBreakMode = .byWordWrapping; 
    label.font = font; 
    label.text = text; 
    label.sizeToFit(); 

    return label.frame.height; 
} 

출력 :

title label height 42.5 
title view height 82.5 

하지만이 또한 다른 라인 때문에 작동하지 않습니다가 표시되지 않는 첫 번째 단지 내가 노력

더 복잡한 방법은 다음이었다 라벨의 라인.

어떻게하면됩니까?

편집은 내가 라벨의 폭을 알고있을 때 작동합니다 레이블 높이를 계산과 접근 방법을 생각한다. 그러나 나는 그것을 어떻게 알아야합니까?

+0

'self.tableView.estimatedRowHeight = 80.0; '대신'estimatedRowHeight'을 120.0;으로 설정하십시오. 'estimatedRowHeight'은 80을 설정하면 tableView 행이 80을 넘지 못하도록합니다. 80보다 더 많이 확장해야하는 경우 120으로 설정해야합니다. 자세한 내용은 https://developer.apple.com/ reference/uikit/utableview/1614925-estimatedrowheight – Rugmangathan

+0

그리고 120보다 커야한다면? 높이는 동적으로 모든 높이가 될 수 있습니다 (레이블의 선의 양에 따라 다름). – Mulgard

+0

방금 ​​높이를 줬습니다. 당신은 당신이 보여주는 메시지에 따라 최대 값을 설정해야합니다. – Rugmangathan

답변

3

개인 성장 경험을 통해 UITableCells를 올바르게 성장시키는 것이 iOS에서 가장 성가신 일 중 하나입니다. 가장 큰 문제는 일반적으로 제약입니다. 그들이 세포보다 더 낫지 않다면 자라지 않을 것입니다.

키는 셀 내용보기의 맨 위에서 내용보기의 맨 아래까지 직선을 그릴 수 있어야합니다. 그래서 귀하의 예제에서 상수는 다음과 같이 보일 것입니다.

topView.top == contentView.top 
label.top == topView.top 
label.bottom == topView.bottom 
topView.bottom == bottomView.top 
bottomView.height == 40 
bottomView.bottom == contentView.bottom 

해당 직선이 없어도 레이아웃이 모든 내용을 표시하는 레이블의 정확한 높이를 결정할 수 없습니다.

그래서 당신은 새로운 샘플 프로젝트에서 찾고있는 무엇을 비교적 간단 버전 : 동일한 레이아웃으로

class ViewController: UITableViewController { 
    @IBOutlet weak var label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.rowHeight = UITableViewAutomaticDimension 
     self.tableView.estimatedRowHeight = 80.0 

     label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 
    } 

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

: 시뮬레이터에서 다음 화면에서 Layout of Table Cell

결과. Result Image

+0

Thx. 그러나 나는 이미 올바른 제약 조건을 가지고있다. 스토리 보드에서 셀 높이를 늘리면 예상대로 레이아웃 동작이 올바르게 작동합니다. 유일한 문제는 셀에 대해 올바른 높이를 얻는 것입니다. – Mulgard

+0

다른 방법은 heightForRowAtIndexPath 함수를 재정의하는 것입니다. 이유는 모르겠지만 정적 세포는 필요하다고 생각됩니다. –

+0

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