在UITableViewCell中扩展UITextView类似于App Store"描述"细胞

时间:2015-12-19 02:11:36

标签: ios iphone swift uitableview uitextview

在iOS App Store中,有一个用于描述应用的单元格。如果文本太长,则单元格有蓝色"更多"按钮,用于扩展单元格以适合整个文本。 " What's New"有相同的功能。详细介绍最新更新的信息。我试过用一些问题来实现这个。

注意:我在故事板中使用AutoLayout。

我有一个UITableViewController子类和一个UITableViewCell子类。

import UIKit

class SystemDetailDescriptionTableViewCell: UITableViewCell {

    static let defaultHeight: CGFloat = 44

    @IBOutlet weak var descriptionTextView: UITextView!

}

在顶部,底部,左侧和右侧,说明文本视图在AutoLayout中设置为0。

接下来,我们有一个UITableViewController子类。我的第一个想法是使用heightForRowAtIndexPath方法。

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if indexPath.section == 0 {
        if self.didExpandDescriptionCell {
            if let cell = tableView.dequeueReusableCellWithIdentifier(StoryboardPrototypeCellIdentifiers.descriptionCell) as? SystemDetailDescriptionTableViewCell {
                return cell.descriptionTextView.contentSize.height
            }
        }
        return SystemDetailDescriptionTableViewCell.defaultHeight
    }
    return tableView.rowHeight
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.section == 0 {
        self.didExpandDescriptionCell = true
        tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    } else {
        if let link = self.links?[indexPath.row] {
            self.performSegueWithIdentifier(StoryboardSegueIdentifiers.toVideoView, sender: link)
        }
    }
}

问题是contentSize没有正确调整文本的全长。相反,它大约是文本的3/4。我听说这个方法不适用于AutoLayout,而是需要使用LayoutManager完成一些技巧,但这些方法返回了完全相同的结果。

有人可以告诉我为什么这不能按预期工作吗?

1 个答案:

答案 0 :(得分:0)

你需要告诉文本视图你应该试着说:

let newSize = cell.descriptionTextView.sizeThatFits(CGSize(width: cell.descriptionTextView.bounds.size.width, height: CGFloat.max))
cell.descriptionTextViewHeightConstraint.constant = newSize.height
return newSize.height

您需要获取内容的适当高度,然后将约束更新为新的高度(如果您已设置高度约束),然后更新单元格高度。此代码假定该单元格中只有descriptionTextView,并且它需要零填充。