     }
     
     
+    /// Returns whether to cancel touches related to the content subview and start dragging.
+    public func touchesShouldCancel(in view: UIView) -> Bool {
+        
+        return false
+    }
+    
+    /// A Boolean value that controls whether touches in the content view always lead to tracking.
+    public var canCancelContentTouches: Bool = true
+    
+    /// A Boolean value that determines whether the scroll view delays the handling of touch-down gestures.
+    public var delaysContentTouches: Bool = true
     
     // MARK: - Zooming and Panning
     

        return contentOffset
    }
    
    private func setRestrainedContentOffset(_ offset: CGPoint) {
        
        let confinedOffset = confinedContentOffset(offset)
        let scrollerBounds = UIEdgeInsetsInsetRect(bounds, contentInset)
        /*
        if !isAlwaysBounceHorizontal && contentSize.width <= scrollerBounds.size.width {
            offset.x = confinedOffset.x
        }
        
        if !isAlwaysBounceVertical && contentSize.height <= scrollerBounds.size.height {
            offset.y = confinedOffset.y
        }
        */
        self.contentOffset = offset
    }
}


        
        if gesture === panGestureRecognizer {
            
            switch panGestureRecognizer.state {
                
            case .began:
                
                beginDragging()
                
            case .changed:
                
                let delta = panGestureRecognizer.translation(in: self)
                
                drag(by: delta)
                
            case .ended:
                
                break
                
            case .possible, .failed, .cancelled:
                
                break
            }
        }
    }
    
    private func beginDragging() {
        
        
    }
    
    private func drag(by delta: CGPoint) {
        
        let confinedDelta = confined(delta: delta, animated: false)
        
        scrollContent(confinedDelta, animated: false)
    }
    
    private func endDragging(velocity: CGPoint) {
        
        
    }
    
    private func confined(delta: CGPoint, animated: Bool) -> CGPoint {
        
        
    }
    
    private func scrollContent(_ delta: CGPoint, animated: Bool) {
        
        
    }
    
    private func updateBounds() {
