无法使用多行标签在表视图中自动调整单元格

时间:2016-04-27 23:33:12

标签: ios swift uitableview

我正在尝试使用多行标签来制作表格视图。不幸的是,我没有运气 - 细胞似乎根本没有调整大小,虽然我得到多线标签。

我的TableViewController的Swift代码:

import UIKit

class QuestionsController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 100.0
        tableView.rowHeight = UITableViewAutomaticDimension
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return questionsData.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("QuestionCell", forIndexPath: indexPath) as! BasicQuestionCell
        let question = questionsData[indexPath.row] as Question
        cell.titleLabel.text = question.content
        return cell
    }
}

结果:

Result of my code

2 个答案:

答案 0 :(得分:6)

正如你没有提到的那样,如果你使用的是自动布局,我假设你正在使用自动布局,并对单元格内的标签给出了必要的约束。

现在只需删除以下两行来自viewDidLoad()

tableView.estimatedRowHeight = 100.0
tableView.rowHeight = UITableViewAutomaticDimension

添加 默认功能,按以下方式进行操作:

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

   return tableView.rowHeight

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

   return UITableViewAutomaticDimension
}

<强>结果:

enter image description here

答案 1 :(得分:2)

您可以执行多项操作来设置UICellView以匹配其标签的高度。如果你知道确切的高度,你可以简单地实现:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    // return the height there
    return 100.0;
}

如果你不知道高度,你需要在运行时获得它的高度,并在相同的功能中重新开始。

有多种方法可以定义细胞的结构。我假设您正在使用动态原型并且只是使用基本样式单元格。

在上面的方法中你可以这样做:

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if let hieght = tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.frame.height {
            return hieght;
        } else {
            print("Couln't adjust the height")
            return 100.0;
        }
    }

如果您以不同的方式定义单元格,则只需实现相同的方法,但返回单元格内标签的高度。