       control.layer.zPosition = -1
       return control
    }()
-   
+
+   fileprivate var _headerViewTopSpaceConstraint: NSLayoutConstraint!
+   fileprivate var _headerViewBottomSpaceConstraint: NSLayoutConstraint!
+   
+   fileprivate lazy var _headerContainerView: UIView = {
+      let headerView = UIView(frame: .zero)
+      headerView.translatesAutoresizingMaskIntoConstraints = false
+      return headerView
+   }()
+   
+   fileprivate lazy var _emptyHeaderView: UIView = {
+      let view = UIView()
+      view.translatesAutoresizingMaskIntoConstraints = false
+      view.heightAnchor.constraint(equalToConstant: 0).isActive = true
+      return view
+   }()
+
    fileprivate var _footerViewTopSpaceConstraint: NSLayoutConstraint!
    fileprivate var _footerViewBottomSpaceConstraint: NSLayoutConstraint!
    

   @objc private func _refreshControlChanged(control: UIRefreshControl) {
      formDelegate?.elementsBeganRefreshing(in: self)
   }
   
   private func _removeFooterView() {
      _update(footerView: _emptyFooterView)
   }
   
   private func _update(footerView: UIView) {
      loadViewIfNeeded()
      _footerContainerView.subviews.forEach { $0.removeFromSuperview() }
      _footerContainerView.addSubview(footerView)
      
      if footerView.translatesAutoresizingMaskIntoConstraints {
         NSLayoutConstraint.activate([
            _footerContainerView.widthAnchor.constraint(equalTo: footerView.widthAnchor),
            _footerContainerView.heightAnchor.constraint(equalTo: footerView.heightAnchor),
            ])
      } else {
         NSLayoutConstraint.activate([
            footerView.centerYAnchor.constraint(equalTo: _footerContainerView.centerYAnchor),
            footerView.centerXAnchor.constraint(equalTo: _footerContainerView.centerXAnchor),
            _footerContainerView.widthAnchor.constraint(equalTo: footerView.widthAnchor),
            _footerContainerView.heightAnchor.constraint(equalTo: footerView.heightAnchor),
            ])
      }
   }

   public var footerView: UIView? {
      didSet {
         switch footerView {
         case .none: _update(containerView: _footerContainerView, with: _emptyFooterView)
         case .some(let view): _update(containerView: _footerContainerView, with: view)
         }
      }
   }
