       }
     }
   }
+  var screenDragLocation: CGPoint = .zero
   public override var contentOffset: CGPoint{
     didSet{
-      contentOffsetProxyAnim.animateTo(contentOffset, stiffness:400, damping:40)
-      print(contentOffset, scrollVelocity)
+      if isDragging {
+        screenDragLocation = absoluteLocation(for: panGestureRecognizer.location(in: self))
+      }
+      if isDragging || isDecelerating {
+        contentOffsetProxyAnim.animateTo(contentOffset, stiffness:400, damping:40)
+      } else {
+        contentOffsetProxyAnim.value.value = contentOffset
+        didScroll()
+      }
     }
   }
   public var visibleFrame: CGRect {

    return contentOffsetProxyAnim.velocity.value
  }
  public var activeFrame: CGRect {
    if let activeFrameSlop = activeFrameSlop {
      return CGRect(x: visibleFrame.origin.x + activeFrameSlop.left, y: visibleFrame.origin.y + activeFrameSlop.top, width: visibleFrame.width - activeFrameSlop.left - activeFrameSlop.right, height: visibleFrame.height - activeFrameSlop.top - activeFrameSlop.bottom)
    } else if wabble {
      return visibleFrame.insetBy(dx:-200, dy: -200)
    } else {
      return visibleFrame
    }
  }




  public func wabbleRect(_ indexPath: IndexPath) -> CGRect {
    let cellFrame = frameForCell(at: indexPath)!
    let cellScreenCenter = absoluteLocation(for: cellFrame.center)
    let cellOffset = cellScreenCenter.distance(screenDragLocation) * scrollVelocity / 5000
    return CGRect(origin: cellFrame.origin + cellOffset, size: cellFrame.size)
  }

