Как установить динамическую высоту uitablviewcell в соответствии с пользовательской высотой xib с помощью uistackview - PullRequest
0 голосов
/ 08 мая 2019

Я не могу установить для UITableViewcell динамическую высоту.

У меня есть пользовательский xib и структура, как показано ниже, и я уже добавляю ограничение на начало, конец и верхнюю часть стека к своему суперпредставлению

class fieldView: UIView {
let kCONTENT_XIB_NAME = "form_field_view"

@IBOutlet weak var contectView: UIView!
@IBOutlet weak var fieldDesc: UILabel!
@IBOutlet weak var fieldInput: customTextField!

var required: Bool?

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()

}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}

func commonInit() {
    Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
    addSubview(contectView)
    contectView.frame = self.bounds
    contectView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    fieldInput.isScrollEnabled = false
}

}

В tableView cellForRowAt я создаю пользовательское представление и добавляю его в каждый UITableViewCell

cell.contentView.addSubview(fieldView)
NSLayoutConstraint(item: fieldView, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: cell.contentView, attribute: NSLayoutConstraint.Attribute.leadingMargin, multiplier: 1.0, constant: 10.0).isActive = true
        NSLayoutConstraint(item: fieldView, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: cell.contentView, attribute: NSLayoutConstraint.Attribute.trailingMargin, multiplier: 1.0, constant: 100.0).isActive = true
        NSLayoutConstraint(item: fieldView, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: cell.contentView, attribute: NSLayoutConstraint.Attribute.topMargin, multiplier: 1.0, constant: 0.0).isActive = true
        NSLayoutConstraint(item: fieldView, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: cell.contentView, attribute: NSLayoutConstraint.Attribute.bottomMargin, multiplier: 1.0, constant: 0.0).isActive = true
return cell

для tableView

override func viewDidLoad() {
    super.viewDidLoad()

    fieldTable.rowHeight = UITableView.automaticDimension
    fieldTable.estimatedRowHeight = 200.0
    }
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if (expanded) {
        return (UITableView.automaticDimension)
    }else{
        return 0
    }
}

Однако фактический результат, как это

Я думаю, что UIStackView изменил свою высоту, но его суперпредставление не изменилось, что также не изменяет ячейку tableview

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Наконец-то я разобрался с этим вопросом

просто добавьте эти две строки

self.tableView.beginUpdates()
self.tableView.endUpdates()

вызывается при изменении содержимого текстового поля

0 голосов
/ 08 мая 2019

Сначала вы должны посчитать количество строк UILabel

 NSInteger lineCount = 0;
 CGSize textSize = CGSizeMake(yourLabel.frame.size.width, MAXFLOAT);
 int rHeight = lroundf([yourLabel sizeThatFits:textSize].height);
 int charSize = lroundf(yourLabel.font.lineHeight);
 lineCount = rHeight/charSize;
 NSLog(@"No of lines: %i",lineCount);

иначе вы можете взять расширение для подсчета максимальной строки метки

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
    }    
}

Используйте это:

let lineCount = YourLabel. calculateMaxLines 

Теперь установите высоту для каждой строки метки

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
   return lineCount * 18 //If total 3 line so 3*18 = 54 is height else you can take any number instead of 18 according to font size height
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...