     // MARK: - Height
     
     open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
-        
+
         let row = sections[indexPath.section].rows[indexPath.row]
-
-        cellRegisterer?.register(cellType: row.cellType, forCellReuseIdentifier: row.reuseIdentifier)
-
         return row.estimatedHeight ?? rowHeightCalculator?.estimatedHeight(forRow: row, at: indexPath) ?? UITableViewAutomaticDimension
     }
     
     open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
         
         let row = sections[indexPath.section].rows[indexPath.row]
+        
+        if shouldUsePrototypeCellHeightCalculation {
+            cellRegisterer?.register(cellType: row.cellType, forCellReuseIdentifier: row.reuseIdentifier)
+        }
 
         let rowHeight = invoke(action: .height, cell: nil, indexPath: indexPath) as? CGFloat
 

    private weak var scrollDelegate: UIScrollViewDelegate?
    private var cellRegisterer: TableCellRegisterer?
    public var rowHeightCalculator: RowHeightCalculator?
    
    open var shouldUsePrototypeCellHeightCalculation: Bool = false {
        didSet {
            if shouldUsePrototypeCellHeightCalculation {

        if shouldUseAutomaticCellRegistration {
            self.cellRegisterer = TableCellRegisterer(tableView: tableView)
        }

        self.scrollDelegate = scrollDelegate
        self.tableView = tableView
        self.tableView?.delegate = self
