      }
 
     // MARK: Helper
+
+    @objc private func didTapControlView(_ recognizer: UIGestureRecognizer) {
+        switch controlUIStatus {
+        case .hidden: controlUIStatus = .show
+        case .show: controlUIStatus = .hidden
+        }
+    }
+
+    func showControlUI() {
+        UIView.animate(withDuration: 0.2, animations: { () -> Void in
+            self.playButton.alpha = 1
+            self.progressTimeLabel.alpha = 1
+            self.durationTimeLabel.alpha = 1
+            self.slashLabel.alpha = 1
+            self.slider.alpha = 1
+        }, completion: { completion in })
+    }
+
+    func hideControlUI() {
+        UIView.animate(withDuration: 0.2, animations: { () -> Void in
+            self.playButton.alpha = 0
+            self.progressTimeLabel.alpha = 0
+            self.durationTimeLabel.alpha = 0
+            self.slashLabel.alpha = 0
+            self.slider.alpha = 0
+        }, completion: { completion in })
+    }
 
     private func removeObserver() {
         for keyPath in observedKeyPaths {

private var playerObserveContext = 0

class MoviePlayerView: UIView {
    // MARK: UI

    @IBOutlet var contentView: UIView!

        #keyPath(AVPlayer.timeControlStatus),
    ]

    private var controlUIStatus: ControlUIStatus = .show {
        didSet {
            switch controlUIStatus {
            case .show: self.showControlUI()
            case .hidden: self.hideControlUI()
            }
        }
    }

    // MARK: Initializer

    override init(frame: CGRect) {
