         
         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() {

        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
    }
}


    }
    
    
    /// 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
    
