             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

    }
    
    func _updateDoubleTapRecognizer() {
        guard (self.doubleTapEnabled == (self._doubleTapRecognizer == nil)) else {
            return
        }
        
        if self.doubleTapEnabled {
            self._doubleTapRecognizer = self._createDoubleTapRecognizer()
            self._scrollView.addGestureRecognizer(self._doubleTapRecognizer!)
        } else {
            self._scrollView.removeGestureRecognizer(self._doubleTapRecognizer!)
            self._doubleTapRecognizer = nil
        }
    }
    
    func _updateZoomOutTapRecognizer() {
        guard (self.zoomOutTapEnabled == (self._zoomOutTapRecognizer == nil)) else {
            return
        }
        
        if self.zoomOutTapEnabled {
            self._zoomOutTapRecognizer = self._createZoomOutRecognizer()
            self._scrollView.addGestureRecognizer(self._zoomOutTapRecognizer!)
        } else {
            self._scrollView.removeGestureRecognizer(self._zoomOutTapRecognizer!)
            self._zoomOutTapRecognizer = nil
        }
    }
    
    // Helpers
    private func _createDoubleTapRecognizer() -> UITapGestureRecognizer {
        let doubleTapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
        doubleTapRecognizer.numberOfTapsRequired = 2
        doubleTapRecognizer.addTarget(
            self,
            action: #selector(_handleDoubleTap(_:))
        )
        
        return doubleTapRecognizer
    }
    
    private func _createZoomOutRecognizer() -> UITapGestureRecognizer {
        let zoomOutRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
        zoomOutRecognizer.numberOfTapsRequired = 2
        zoomOutRecognizer.numberOfTouchesRequired = 2
        zoomOutRecognizer.addTarget(
            self,
            action: #selector(_handleZoomOutTap)
        )
        
        return zoomOutRecognizer
    }
}


}


// MARK: Tap Recognizers
private extension ZoomView {
    func _updateTapRecognizers() {
