如何检查UITableViewCell标签是否被截断?

时间:2019-06-14 06:16:04

标签: ios swift tableview

我有一个像动态字符串这样的数据。
而且我想检查此字符串是否超出我的标签宽度(numberOfLines等于1)。
如果超出标签宽度,请使用cellA
如果没有超出标签宽度,则使用cellB
我的观点是如何检查和更改“ isLongName”布尔值。 有什么建议吗?

var isLongName: Bool = false

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // How to check the string is long name (width out of cellB)

        if isLongName && indexPath.row == 3 {                

            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellA", for: indexPath) as! TableViewCellA

            cell.titleLabel.text = itemsArray[indexPath.row].title
            cell.subtitleLabel.text = itemsArray[indexPath.row].value
            cell.expandBtn.addTarget(self, action: #selector(expandBtnPressed), for: .touchUpInside)
            cell.expandBtn.tag = indexPath.row

            if isExpand {
                cell.expandBtn.setTitle("close", for: .normal)
                cell.subtitleLabel.numberOfLines = 0
            } else {
                cell.expandBtn.setTitle("open", for: .normal)
                cell.subtitleLabel.numberOfLines = 1
            }

            cell.remakeLayout(isExpand: isExpand)

            return cell

        } else {

            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellB", for: indexPath) as! TableViewCellB
            cell.titleLabel.text = itemsArray[indexPath.row].title
            cell.subtitleLabel.text = itemsArray[indexPath.row].value

            return cell
        }

    }

@objc func expandBtnPressed(sender: UIButton) {

        let indexPath = IndexPath(row: sender.tag, section: 0)

        UIView.performWithoutAnimation {
            tableView.beginUpdates()
            self.isExpand = !isExpand
            tableView.reloadRows(at: [indexPath], with: .none)
            tableView.endUpdates()
        }
    }

2 个答案:

答案 0 :(得分:0)

添加UILabel的以下扩展名

extension UILabel {
    func calculateMaxLines() -> Int {
        let maxSize = CGSize(width: frame.size.width, height: CGFloat(Float.infinity))
        let charSize = font.lineHeight
        let text = (self.text ?? "") as NSString
        let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
        let linesRoundedUp = Int(ceil(textSize.height/charSize)) 
        return linesRoundedUp
    }    
}

在将文本分配给UIlabel之后,检查所需的行数。如果您从calculateMaxLines得到结果1,则不需要显示更多按钮。

cell.subtitleLabel.text = itemsArray[indexPath.row].value
print("number of line required: ",cell.subtitleLabel.calculateMaxLines())

答案 1 :(得分:0)

您可以使用标签扩展名来标识标签上的数字行,并且可以切换单元格。尝试使用此扩展名来确定行数。

extension UILabel {

    func numberOfLines() -> Int {
        let textSize = CGSize(width: self.frame.size.width, height: CGFloat(Float.infinity))
        let rHeight = lroundf(Float(self.sizeThatFits(textSize).height))
        let charSize = lroundf(Float(self.font.lineHeight))
        let lineCount = rHeight/charSize
        return lineCount
    }

}

对于您的方案,可以这样使用:-

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       let baseCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellB", for: indexPath) as! TableViewCellB


        if baseCell.titleLabel.numberOfLines() > 1 && indexPath.row == 3 {                

            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellA", for: indexPath) as! TableViewCellA

            cell.titleLabel.text = itemsArray[indexPath.row].title
            cell.subtitleLabel.text = itemsArray[indexPath.row].value
            cell.expandBtn.addTarget(self, action: #selector(expandBtnPressed), for: .touchUpInside)
            cell.expandBtn.tag = indexPath.row

            if isExpand {
                cell.expandBtn.setTitle("close", for: .normal)
                cell.subtitleLabel.numberOfLines = 0
            } else {
                cell.expandBtn.setTitle("open", for: .normal)
                cell.subtitleLabel.numberOfLines = 1
            }

            cell.remakeLayout(isExpand: isExpand)

            return cell

        } else {

            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellB", for: indexPath) as! TableViewCellB
            cell.titleLabel.text = itemsArray[indexPath.row].title
            cell.subtitleLabel.text = itemsArray[indexPath.row].value

            return cell
        }

    }