             self._updateZoomOutTapRecognizer()
         }
     }
-}
-
-
-// MARK: Override Implementations
-private extension ZoomView {
-    // MARK: Frame / Size Overrides
+    
+    var _doubleTapRecognizer: UITapGestureRecognizer {
+        return self.__doubleTapRecognizer ?? {
+            let doubleTapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
+            doubleTapRecognizer.numberOfTapsRequired = 2
+            doubleTapRecognizer.addTarget(
+                self,
+                action: #selector(_handleDoubleTap(_:))
+            )
+            
+            self.__doubleTapRecognizer = doubleTapRecognizer
+            return doubleTapRecognizer
+        }()
+    }
+    
+    var _zoomOutTapRecognizer: UITapGestureRecognizer {
+        return self.__zoomOutTapRecognizer ?? {
+            let zoomOutRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
+            zoomOutRecognizer.numberOfTapsRequired = 2
+            zoomOutRecognizer.numberOfTouchesRequired = 2
+            zoomOutRecognizer.addTarget(
+                self,
+                action: #selector(_handleZoomOutTap)
+            )
+            
+            self.__zoomOutTapRecognizer = zoomOutRecognizer
+            return zoomOutRecognizer
+        }()
+    }
+}
+
+
+// MARK: Frame / Size Override Implementations
+private extension ZoomView {
     var _frame: CGRect {
         get {
             return super.frame

    // Private Variables
    fileprivate var _contentView: UIView
    
    fileprivate var _doubleTapRecognizer: UITapGestureRecognizer?
    fileprivate var _zoomOutTapRecognizer: UITapGestureRecognizer?
    
    fileprivate var _zoomThreshold: CGFloat = 1
    fileprivate var __doubleTapEnabled: Bool = true

}


// MARK: Computed Variables
private extension ZoomView {
    var _doubleTapEnabled: Bool {
        get {
