heightForRowAt вызывается после cellforRowAt в UITableView
Всякий раз, когда я перезагружаю tableView, heightForRowAt
вызывается после cellForRowAt
, В следующем порядке:
numberofsections -> numberOfRowsInSection -> cellForRowAt -> heightForRow
Я переопределил numberOfSections, numberOfRowsInSection, viewForHeaderInSection
методы. Имеют ли они какое-либо влияние на порядок, в котором heightForRow
а также cellForRowAt
называются?
Я использую Xcode 9.1, Swift 3, работающий на iOS 11.
1 ответ
У вас есть два варианта здесь:
- Сделайте contentView ячейки так, как она будет определять ее размер. Это означает, что ваш макет не должен быть амбициозным по вертикали.
Рассчитайте его размер вручную. Суммируйте смещения (высоты) между (из) подпредставлениями. Здесь может быть проблема для вычисления размера label / textView (оставьте вспомогательное расширение для расчета размера текста, который я использую). Обратите внимание на textView.contentInsets! Вы должны помнить, чтобы получить правильный размер
extension String { func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil) return ceil(boundingBox.height) } func width(withConstraintedHeight height: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height) let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil) return ceil(boundingBox.width) } }
Надеюсь, это поможет вам!