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

      return control
   }()
   
   fileprivate var _cvLeadingSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint()
   fileprivate lazy var _collectionView: UICollectionView = {
      let cv = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
      cv.translatesAutoresizingMaskIntoConstraints = false
      self.view.addSubview(cv)
      let footerView = self.footerView
      self.view.addSubview(footerView)
      
      footerView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
      footerView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
      
      cv.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
      cv.bottomAnchor.constraint(equalTo: footerView.topAnchor).isActive = true
      cv.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
      
      self._cvLeadingSpaceConstraint = cv.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)

   
      return cv
   }()
   
   fileprivate var _cvLeadingSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint()
   fileprivate var _animatingIndexPaths: [IndexPath]?
   fileprivate var _needsReload: Bool = false
   fileprivate var _needsLayout: Bool = false
