iOS 中的自调整(动态高度)单元格 8 - 没有自定义 UITableViewCell 可能吗?

Self-Sizing (Dynamic Height) Cells in iOS 8 - Possible without Custom UITableViewCell?

是否可以在不创建自定义 UITableViewCell 的情况下在 iOS 8 中自行调整 UITableViewCell 的大小?

我认为标准的 UITableViewCell 类型(UITableViewCellStyleDefault、UITableViewCellStyleSubtitle、UITableViewCellStyleValue1、UITableViewCellStyleValue2)内置了自动布局约束。非自定义单元格的约束无法在 Storyboard 中更改这一事实证实了这一点。

但是当我使用类型为 UITableViewCellStyleValue1 的非自定义单元格时,在 Storyboard 中进行设置,将 textLabel 和 detailTextLabel 的 numberOfRows 设置为 0,并如下设置 viewDidLoad 代码时,仅考虑单元格的 textLabel在单元格高度的自动调整中。如果 detailTextLabel 最终显示的行多于 textLabel,则 detailTextLabel 的文本会溢出单元格的顶部和底部边缘。同样,单元格确实会针对 textLabel 正确调整大小,但似乎在调整大小的过程中忽略了 detailTextLabel。

我需要知道的主要事情是 - 如果我想正确支持动态文本和自调整大小,我是否需要为可以使用标准单元格的行创建自定义单元格?

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEstimatedRowHeight:DEFAULT_ROW_HEIGHT];
    [self.tableView setRowHeight:UITableViewAutomaticDimension];
}

我刚刚在 iOS 10/XCode 8 中尝试了这个(在 iOS 9/XCode 7 中结果相同)使用不同的细胞类型,它看起来像仅适用于 textLabel 而不适用于 detailTextLabel。

(基本上重复OP提到的问题)

ViewController 在 detailTextLabel 和 textLabel 上交替设置一些文本的代码。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 44
        tableView.rowHeight = UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        if indexPath.row % 2 == 0 {
            cell.textLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
            cell.detailTextLabel?.text = "<- textLabel"
        } else {
            cell.textLabel?.text = "detailTextLabel ->"
            cell.detailTextLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
        }
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

}

确保将 textLabel 和 textDetailLabel 的行 属性 设置为 0,这是结果。

基本单元格

右侧详细信息单元格

左侧详细信息单元格

字幕单元格

我会将其报告为错误。