получить высоту динамического textViews в tableView без использования автоматических размеров с помощью swift - PullRequest
0 голосов
/ 07 мая 2018

Я хочу вычислить высоту моих textView в табличном представлении динамически для использования в heightForRowAt. Я НЕ хочу использовать автоматические размеры, поскольку это часто портит мою прокрутку в containerViews.

В настоящее время я создаю textView для каждой ячейки, добавляю текст и получаю высоту, используя:

var textViewForCellHeight = UITextView()
textViewForCellHeight.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.body)

textViewForCellHeight.frame = CGRect(x: 0, y: 0, width: self.tableView.frame.size.width - cellHorizontalPadding - tableView.safeAreaInsets.left - tableView.safeAreaInsets.right, height: 0)
textViewForCellHeight.text = myString
textViewForCellHeight.sizeToFit()
return textViewForCellHeight.frame.size.height

Использование этого в heightForRowAt прекрасно работает и дает правильную высоту для ячейки, но это дорого и значительно замедляет tableView. Есть ли более эффективный способ динамического получения высоты ячейки tableView с помощью textView?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

 func calculateHeight(inString:String) -> CGFloat
{
    let messageString = input.text
    let attributes : [NSAttributedStringKey : Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont.systemFont(ofSize: 15.0)]

    let attributedString : NSAttributedString = NSAttributedString(string: messageString!, attributes: attributes)

    let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

    let requredSize:CGRect = rect
    return requiredSize.height
}
0 голосов
/ 07 мая 2018

Попробуйте этот код:

 func cellHeight(withTxt string: String) -> Float {
        let textRect: CGRect = string.boundingRect(with: CGSize(width: self.view.frame.width/* Preferred textView Width */, height: CGFloat(MAXFLOAT)), options: ([.usesLineFragmentOrigin, .usesFontLeading]), attributes: [.font: UIFont(name: "Helvetica Neue", size: 17)!], context: nil)
        let requiredSize: CGSize = textRect.size
        //finally u return your height
        return Float(requiredSize.height)
 }
...