Как проверить, что метка UITableViewCell является усеченной или нет? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть данные, такие как динамическая строка.
И я хочу убедиться, что эта строка не соответствует моей ширине метки, которая равна numberOfLines.
Если из моей ширины этикетки я использую cellA.
Если не из моей ширины этикетки, я использую cellB.
И моя точка зрения заключается в том, как проверить и изменить "isLongName" boolvalue. Есть предложения для меня?

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 голосов
/ 14 июня 2019

Вы можете использовать расширение метки, чтобы идентифицировать номера строк на метке, и вы можете переключать ячейки.Попробуйте это расширение, чтобы определить количество строк.

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
        }

    }
0 голосов
/ 14 июня 2019

Добавить следующее расширение 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 проверьте требуемое количество строк.если вы получили результат 1 из calculateMaxLines, то не нужно показывать больше кнопки.

cell.subtitleLabel.text = itemsArray[indexPath.row].value
print("number of line required: ",cell.subtitleLabel.calculateMaxLines())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...