             return .dragging(offset: currentOffset)
         }
     }
+    
+    lazy var lastState: State = self.state
     
     func offset(forState state: State.Settle) -> CGFloat? {
         switch state {

        }
        set {
            guard newValue != currentOffset else { return }
            header?.frame.origin.y = newValue
            scroll.frame.origin.y = header?.frame.maxY ?? newValue
            

        scroll.frame.size = CGSize(width: bounds.width, height: bounds.height - (header?.bounds.height ?? 0) - topPadding)
    }
    
    func update(animated: Bool = false, to targetOffset: CGFloat? = nil, velocity: CGFloat? = nil, keepLastState: Bool = true) {
        
        // Get actual target
        let target: CGFloat
        if let targetOffset = targetOffset {
            target = targetOffset
        } else if keepLastState, case .settled(let settled) = lastState, let settledOffset = self.offset(forState: settled) {
            target = settledOffset
        } else {
            target = currentOffset
