heightForRowAt вызывается после cellforRowAt в UITableView

Всякий раз, когда я перезагружаю tableView, heightForRowAt вызывается после cellForRowAt, В следующем порядке:

 numberofsections -> numberOfRowsInSection -> cellForRowAt -> heightForRow

Я переопределил numberOfSections, numberOfRowsInSection, viewForHeaderInSection методы. Имеют ли они какое-либо влияние на порядок, в котором heightForRow а также cellForRowAt называются?

Я использую Xcode 9.1, Swift 3, работающий на iOS 11.

1 ответ

У вас есть два варианта здесь:

  1. Сделайте contentView ячейки так, как она будет определять ее размер. Это означает, что ваш макет не должен быть амбициозным по вертикали.
  2. Рассчитайте его размер вручную. Суммируйте смещения (высоты) между (из) подпредставлениями. Здесь может быть проблема для вычисления размера 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)
         }
    }
    

Надеюсь, это поможет вам!

Другие вопросы по тегам