我有一个像动态字符串这样的数据。
而且我想检查此字符串是否超出我的标签宽度(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()
}
}
答案 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
}
}