marinofaggiana 3 年之前
父节点
当前提交
4ca374971d

+ 1 - 1
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift

@@ -153,7 +153,7 @@ class NCPlayerToolBar: UIView {
         
         if !self.isHidden { return }
         if let detailView = detailView {
-            //if detailView.isShow() { return }
+            if detailView.isShow() { return }
         }
         
         updateToolBar()

+ 151 - 0
iOSClient/Viewer/NCViewerMedia/NCViewerMedia.storyboard

@@ -96,6 +96,152 @@
                                         <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                         <nil key="highlightedColor"/>
                                     </label>
+                                    <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="P8R-4f-zAl" customClass="NCViewerMediaDetailView" customModule="Nextcloud" customModuleProvider="target">
+                                        <rect key="frame" x="0.0" y="336" width="414" height="352"/>
+                                        <subviews>
+                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HRq-3M-yeb">
+                                                <rect key="frame" x="15" y="20" width="384" height="1"/>
+                                                <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="height" constant="1" id="X4S-cr-F2P"/>
+                                                </constraints>
+                                            </view>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="size" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WXS-Lw-DkI">
+                                                <rect key="frame" x="15" y="36" width="80" height="16"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="width" constant="80" id="DLa-7b-rDS"/>
+                                                </constraints>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="size value" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XLb-0a-du9">
+                                                <rect key="frame" x="105" y="36" width="294" height="16"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="date" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Son-CZ-zFa">
+                                                <rect key="frame" x="15" y="62" width="80" height="16"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="width" constant="80" id="e83-SZ-3FA"/>
+                                                </constraints>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="date value" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hBd-KD-Jq5">
+                                                <rect key="frame" x="105" y="62" width="294" height="16"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="dim" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uaE-Lv-t0Q">
+                                                <rect key="frame" x="15" y="88" width="80" height="16"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="width" constant="80" id="iwq-Fq-8U0"/>
+                                                </constraints>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="dim value" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n1C-OB-gq2">
+                                                <rect key="frame" x="105" y="88" width="294" height="16"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <mapView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" mapType="standard" translatesAutoresizingMaskIntoConstraints="NO" id="Typ-A8-XIO">
+                                                <rect key="frame" x="15" y="150" width="384" height="174"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="height" constant="174" id="VRv-eR-bwo"/>
+                                                </constraints>
+                                            </mapView>
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oov-9f-Oeu">
+                                                <rect key="frame" x="15" y="324" width="384" height="28"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <state key="normal" title="location"/>
+                                                <connections>
+                                                    <action selector="touchLocation:" destination="P8R-4f-zAl" eventType="touchUpInside" id="Z9s-pM-WsS"/>
+                                                </connections>
+                                            </button>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="lens" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uYI-ic-d8g">
+                                                <rect key="frame" x="15" y="114" width="80" height="16"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="width" constant="80" id="egy-z4-Im6"/>
+                                                </constraints>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="lens value" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ix8-uQ-chU">
+                                                <rect key="frame" x="105" y="114" width="294" height="16"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="message" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="03V-nM-JHv">
+                                                <rect key="frame" x="15" y="135" width="384" height="31"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="height" constant="31" id="8Ex-vg-76t"/>
+                                                </constraints>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                        </subviews>
+                                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <constraints>
+                                            <constraint firstItem="WXS-Lw-DkI" firstAttribute="top" secondItem="HRq-3M-yeb" secondAttribute="bottom" constant="15" id="2RK-lk-nQe"/>
+                                            <constraint firstItem="uaE-Lv-t0Q" firstAttribute="top" secondItem="Son-CZ-zFa" secondAttribute="bottom" constant="10" id="3jD-4U-zwi"/>
+                                            <constraint firstItem="XLb-0a-du9" firstAttribute="centerY" secondItem="WXS-Lw-DkI" secondAttribute="centerY" id="6k5-Ur-AKZ"/>
+                                            <constraint firstAttribute="trailing" secondItem="n1C-OB-gq2" secondAttribute="trailing" constant="15" id="6o9-lb-LZc"/>
+                                            <constraint firstItem="03V-nM-JHv" firstAttribute="top" secondItem="uYI-ic-d8g" secondAttribute="bottom" constant="5" id="7Uh-9y-EY1"/>
+                                            <constraint firstAttribute="trailing" secondItem="HRq-3M-yeb" secondAttribute="trailing" constant="15" id="DIq-e4-T4P"/>
+                                            <constraint firstItem="XLb-0a-du9" firstAttribute="leading" secondItem="WXS-Lw-DkI" secondAttribute="trailing" constant="10" id="Iqg-lN-NpB"/>
+                                            <constraint firstItem="n1C-OB-gq2" firstAttribute="centerY" secondItem="uaE-Lv-t0Q" secondAttribute="centerY" id="KMX-7y-YXP"/>
+                                            <constraint firstItem="uYI-ic-d8g" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="MTM-eQ-CXC"/>
+                                            <constraint firstItem="oov-9f-Oeu" firstAttribute="top" secondItem="Typ-A8-XIO" secondAttribute="bottom" id="MUo-UC-1d4"/>
+                                            <constraint firstItem="ix8-uQ-chU" firstAttribute="centerY" secondItem="uYI-ic-d8g" secondAttribute="centerY" id="Oae-3R-C5Z"/>
+                                            <constraint firstAttribute="trailing" secondItem="ix8-uQ-chU" secondAttribute="trailing" constant="15" id="TIp-le-wVn"/>
+                                            <constraint firstItem="hBd-KD-Jq5" firstAttribute="centerY" secondItem="Son-CZ-zFa" secondAttribute="centerY" id="Tez-na-gqC"/>
+                                            <constraint firstItem="HRq-3M-yeb" firstAttribute="top" secondItem="P8R-4f-zAl" secondAttribute="top" constant="20" id="UF1-fO-9hX"/>
+                                            <constraint firstItem="03V-nM-JHv" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="Wkx-6P-u9F"/>
+                                            <constraint firstAttribute="trailing" secondItem="03V-nM-JHv" secondAttribute="trailing" constant="15" id="YYB-CF-RWS"/>
+                                            <constraint firstAttribute="bottom" secondItem="oov-9f-Oeu" secondAttribute="bottom" id="YuK-2v-kzk"/>
+                                            <constraint firstItem="hBd-KD-Jq5" firstAttribute="leading" secondItem="Son-CZ-zFa" secondAttribute="trailing" constant="10" id="YuO-13-KTh"/>
+                                            <constraint firstItem="WXS-Lw-DkI" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="bRd-bi-Imh"/>
+                                            <constraint firstItem="uYI-ic-d8g" firstAttribute="top" secondItem="uaE-Lv-t0Q" secondAttribute="bottom" constant="10" id="bkM-Ic-ZoE"/>
+                                            <constraint firstItem="Typ-A8-XIO" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="jre-DM-hm3"/>
+                                            <constraint firstItem="oov-9f-Oeu" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="lXY-IM-uQB"/>
+                                            <constraint firstAttribute="trailing" secondItem="oov-9f-Oeu" secondAttribute="trailing" constant="15" id="mpQ-4V-Yfc"/>
+                                            <constraint firstAttribute="trailing" secondItem="Typ-A8-XIO" secondAttribute="trailing" constant="15" id="nAm-fh-5Px"/>
+                                            <constraint firstItem="Typ-A8-XIO" firstAttribute="top" secondItem="ix8-uQ-chU" secondAttribute="bottom" constant="20" id="o5C-6S-80Q"/>
+                                            <constraint firstItem="HRq-3M-yeb" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="oJB-7U-UpU"/>
+                                            <constraint firstAttribute="trailing" secondItem="XLb-0a-du9" secondAttribute="trailing" constant="15" id="p7C-ox-HFw"/>
+                                            <constraint firstAttribute="trailing" secondItem="hBd-KD-Jq5" secondAttribute="trailing" constant="15" id="sKA-YA-3Uc"/>
+                                            <constraint firstItem="uaE-Lv-t0Q" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="tnj-dz-2rk"/>
+                                            <constraint firstItem="ix8-uQ-chU" firstAttribute="leading" secondItem="uYI-ic-d8g" secondAttribute="trailing" constant="10" id="vPD-6e-zeT"/>
+                                            <constraint firstItem="Son-CZ-zFa" firstAttribute="leading" secondItem="P8R-4f-zAl" secondAttribute="leading" constant="15" id="vsg-gX-rNv"/>
+                                            <constraint firstItem="n1C-OB-gq2" firstAttribute="leading" secondItem="uaE-Lv-t0Q" secondAttribute="trailing" constant="10" id="yAH-Dt-LC5"/>
+                                            <constraint firstItem="Son-CZ-zFa" firstAttribute="top" secondItem="WXS-Lw-DkI" secondAttribute="bottom" constant="10" id="z9W-ZR-cUN"/>
+                                        </constraints>
+                                        <connections>
+                                            <outlet property="dateLabel" destination="Son-CZ-zFa" id="0Wi-XW-0hw"/>
+                                            <outlet property="dateValue" destination="hBd-KD-Jq5" id="ple-nX-OpH"/>
+                                            <outlet property="dimLabel" destination="uaE-Lv-t0Q" id="MkZ-ko-UrJ"/>
+                                            <outlet property="dimValue" destination="n1C-OB-gq2" id="Ln4-gV-wXg"/>
+                                            <outlet property="lensModelLabel" destination="uYI-ic-d8g" id="DUn-uJ-sVj"/>
+                                            <outlet property="lensModelValue" destination="ix8-uQ-chU" id="GNF-8F-10P"/>
+                                            <outlet property="locationButton" destination="oov-9f-Oeu" id="cGg-Gb-m5S"/>
+                                            <outlet property="mapHeightConstraint" destination="VRv-eR-bwo" id="jXn-vm-aJk"/>
+                                            <outlet property="mapView" destination="Typ-A8-XIO" id="XCg-a6-NUq"/>
+                                            <outlet property="messageLabel" destination="03V-nM-JHv" id="dpK-Iy-LCD"/>
+                                            <outlet property="separator" destination="HRq-3M-yeb" id="ENP-xc-AWZ"/>
+                                            <outlet property="sizeLabel" destination="WXS-Lw-DkI" id="JG0-G0-oHg"/>
+                                            <outlet property="sizeValue" destination="XLb-0a-du9" id="9jm-Ku-sgt"/>
+                                        </connections>
+                                    </view>
                                     <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sBp-t2-eFh" customClass="NCPlayerToolBar" customModule="Nextcloud" customModuleProvider="target">
                                         <rect key="frame" x="25" y="626" width="364" height="100"/>
                                         <subviews>
@@ -227,12 +373,17 @@
                             <constraint firstItem="Yo6-7W-moG" firstAttribute="trailing" secondItem="sBp-t2-eFh" secondAttribute="trailing" constant="25" id="TCr-e0-gnG"/>
                             <constraint firstItem="2AU-85-K8y" firstAttribute="leading" secondItem="Yo6-7W-moG" secondAttribute="leading" constant="10" id="X10-OG-EKg"/>
                             <constraint firstItem="Yo6-7W-moG" firstAttribute="top" secondItem="2AU-85-K8y" secondAttribute="top" constant="-10" id="avO-83-uMQ"/>
+                            <constraint firstItem="Yo6-7W-moG" firstAttribute="bottom" secondItem="P8R-4f-zAl" secondAttribute="top" constant="400" id="bor-cg-Alz"/>
+                            <constraint firstItem="P8R-4f-zAl" firstAttribute="leading" secondItem="Yo6-7W-moG" secondAttribute="leading" id="dly-i5-fPW"/>
                             <constraint firstItem="CdQ-LC-Trx" firstAttribute="leading" secondItem="fIE-H6-KKc" secondAttribute="leading" id="g8C-2m-KkX"/>
                             <constraint firstItem="CdQ-LC-Trx" firstAttribute="top" secondItem="fIE-H6-KKc" secondAttribute="top" id="hcQ-lB-JwU"/>
                             <constraint firstItem="sBp-t2-eFh" firstAttribute="leading" secondItem="Yo6-7W-moG" secondAttribute="leading" constant="25" id="hwP-QY-nRI"/>
+                            <constraint firstItem="Yo6-7W-moG" firstAttribute="trailing" secondItem="P8R-4f-zAl" secondAttribute="trailing" id="jf2-Nv-gFi"/>
                         </constraints>
                     </view>
                     <connections>
+                        <outlet property="detailView" destination="P8R-4f-zAl" id="xFW-qq-Cdi"/>
+                        <outlet property="detailViewConstraint" destination="bor-cg-Alz" id="Hwu-z8-2SS"/>
                         <outlet property="imageVideoContainer" destination="kPV-JM-UnM" id="2pA-VW-FuK"/>
                         <outlet property="imageViewBottomConstraint" destination="vEd-X2-yGs" id="wp3-67-aZ2"/>
                         <outlet property="imageViewTopConstraint" destination="tdo-XY-uqv" id="AM2-tz-fSt"/>

+ 1 - 1
iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift

@@ -180,7 +180,7 @@ class NCViewerMedia: UIViewController {
         }
         
         // Detail Text Color
-        currentViewController.detailView?.textColor(textColor)
+        currentViewController.detailView.textColor(textColor)
     }
     
     //MARK: - NotificationCenter

+ 20 - 3
iOSClient/Viewer/NCViewerMedia/NCViewerMediaDetailView.swift

@@ -37,6 +37,7 @@ class NCViewerMediaDetailView: UIView {
     @IBOutlet weak var lensModelLabel: UILabel!
     @IBOutlet weak var lensModelValue: UILabel!
     @IBOutlet weak var messageLabel: UILabel!
+    @IBOutlet weak var mapHeightConstraint: NSLayoutConstraint!
     @IBOutlet weak var mapView: MKMapView!
     @IBOutlet weak var locationButton: UIButton!
 
@@ -47,6 +48,7 @@ class NCViewerMediaDetailView: UIView {
     var location: String?
     var date: NSDate?
     var lensModel: String?
+    var heightMap: CGFloat = 0
     var size: Int64 = 0
     var image: UIImage?
     
@@ -68,6 +70,8 @@ class NCViewerMediaDetailView: UIView {
     
     deinit {
         print("deinit NCViewerMediaDetailView")
+        
+        mapView.delegate = nil
     }
     
     func textColor(_ textColor: UIColor?) {
@@ -80,16 +84,25 @@ class NCViewerMediaDetailView: UIView {
     
     func show(textColor: UIColor?) {
         self.textColor(textColor)
+        isHidden = false
+    }
+    
+    func hide() {
+        isHidden = true
+    }
+    
+    func isShow() -> Bool {
+        return !isHidden
     }
     
     //MARK: - EXIF
     
-    func update(metadata: tableMetadata, image: UIImage?, textColor: UIColor?) {
+    func update(metadata: tableMetadata, image: UIImage?, heightMap:  CGFloat) {
                     
         self.metadata = metadata
+        self.heightMap = heightMap
         self.image = image
         self.size = metadata.size
-        self.textColor(textColor)
         
         if metadata.classFile == NCCommunicationCommon.typeClassFile.image.rawValue {
             CCUtility.setExif(metadata) { (latitude, longitude, location, date, lensModel) in
@@ -105,7 +118,6 @@ class NCViewerMediaDetailView: UIView {
         } else {
             self.updateContent()
         }
-        
     }
     
     //MARK: - Map
@@ -168,6 +180,11 @@ class NCViewerMediaDetailView: UIView {
             mapView.addAnnotation(annotation)
             mapView.setRegion(MKCoordinateRegion(center: annotation.coordinate, latitudinalMeters: 500, longitudinalMeters: 500), animated: false)
             locationButton.setTitle(location, for: .normal)
+            mapHeightConstraint.constant = self.heightMap
+            
+        } else {
+            
+            mapHeightConstraint.constant = 0
         }
     }
     

+ 45 - 52
iOSClient/Viewer/NCViewerMedia/NCViewerMediaZoom.swift

@@ -26,19 +26,20 @@ import NCCommunication
 
 class NCViewerMediaZoom: UIViewController {
     
+    @IBOutlet weak var detailViewConstraint: NSLayoutConstraint!
     @IBOutlet weak var imageViewTopConstraint: NSLayoutConstraint!
     @IBOutlet weak var imageViewBottomConstraint: NSLayoutConstraint!
+    
     @IBOutlet weak var scrollView: UIScrollView!
     @IBOutlet weak var imageVideoContainer: imageVideoContainerView!
     @IBOutlet weak var statusViewImage: UIImageView!
     @IBOutlet weak var statusLabel: UILabel!
+    @IBOutlet weak var detailView: NCViewerMediaDetailView!
     @IBOutlet weak var playerToolBar: NCPlayerToolBar!
     
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     var viewerMedia: NCViewerMedia?
     var ncplayer: NCPlayer?
-    var detailView: NCViewerMediaDetailView?
-    var detailViewTopConstraint: NSLayoutConstraint?
     var image: UIImage?
     var metadata: tableMetadata = tableMetadata()
     var index: Int = 0
@@ -96,7 +97,10 @@ class NCViewerMediaZoom: UIViewController {
         }  else {
             statusViewImage.image = nil
             statusLabel.text = ""
-        }        
+        }
+        
+        detailViewConstraint.constant = 0
+        detailView.hide()
     }
     
     override func viewWillAppear(_ animated: Bool) {
@@ -159,12 +163,12 @@ class NCViewerMediaZoom: UIViewController {
             // back to the original size
             self.scrollView.zoom(to: CGRect(x: 0, y: 0, width: self.scrollView.bounds.width, height: self.scrollView.bounds.height), animated: false)
             self.view.layoutIfNeeded()
-//            UIView.animate(withDuration: context.transitionDuration) {
+            UIView.animate(withDuration: context.transitionDuration) {
                 // resize detail
-//                if let detailView = self.detailView, detailView.isShow() {
-//                    self.openDetail()
-//                }
-//            }
+                if self.detailView.isShow() {
+                    self.openDetail()
+                }
+            }
         }) { (_) in }
     }
     
@@ -182,7 +186,7 @@ class NCViewerMediaZoom: UIViewController {
 
     @objc func didDoubleTapWith(gestureRecognizer: UITapGestureRecognizer) {
         
-        if detailView != nil { return }
+        if detailView.isShow() { return }
         
         // NO ZOOM for Audio / Video
         if (metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue) && !playerToolBar.isHidden {
@@ -215,17 +219,16 @@ class NCViewerMediaZoom: UIViewController {
             
             // gesture moving Up
             if velocity.y < 0 {
-//                var heightMap = (view.bounds.height / 3)
-//                if view.bounds.width < view.bounds.height {
-//                    heightMap = (view.bounds.width / 3)
-//                }
-//                detailView.update(metadata: metadata, image: image, heightMap: heightMap)
+                var heightMap = (view.bounds.height / 3)
+                if view.bounds.width < view.bounds.height {
+                    heightMap = (view.bounds.width / 3)
+                }
+                detailView.update(metadata: metadata, image: image, heightMap: heightMap)
             }
-            break
 
         case .ended:
             
-            if self.detailView != nil {
+            if detailView.isShow() {
                 self.imageViewTopConstraint.constant = -imageViewConstraint
                 self.imageViewBottomConstraint.constant = imageViewConstraint
             } else {
@@ -239,21 +242,21 @@ class NCViewerMediaZoom: UIViewController {
             imageViewBottomConstraint.constant = -(currentLocation.y - imageViewConstraint)
             
             // DISMISS VIEW
-            if detailView == nil && (currentLocation.y > 20) {
+            if detailView.isHidden && (currentLocation.y > 20) {
                 
                 viewerMedia?.navigationController?.popViewController(animated: true)
                 gestureRecognizer.state = .ended
             }
             
             // CLOSE DETAIL
-            if detailView != nil && (currentLocation.y > 20) {
+            if !detailView.isHidden && (currentLocation.y > 20) {
                                
                 self.closeDetail()
                 gestureRecognizer.state = .ended
             }
 
             // OPEN DETAIL
-            if detailView == nil && (currentLocation.y < -20) {
+            if detailView.isHidden && (currentLocation.y < -20) {
                        
                 self.openDetail()
                 gestureRecognizer.state = .ended
@@ -271,51 +274,41 @@ extension NCViewerMediaZoom {
     
     private func openDetail() {
         
-        if let detailView = Bundle.main.loadNibNamed("NCViewerMediaDetailView", owner: self, options: nil)?.first as? NCViewerMediaDetailView {
-            detailView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height/2)
-            self.detailView = detailView
-            self.view.addSubview(detailView)
-            detailView.translatesAutoresizingMaskIntoConstraints = false
-            detailViewTopConstraint = detailView.topAnchor.constraint(equalTo: view.topAnchor, constant: 400)
-            detailViewTopConstraint?.isActive = true
-            detailView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
-            detailView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
-            detailView.heightAnchor.constraint(equalToConstant: self.view.frame.height/2).isActive = true
-            detailView.update(metadata: metadata, image: image, textColor: self.viewerMedia?.textColor)
-            
-            if let image = imageVideoContainer.image {
-                let ratioW = imageVideoContainer.frame.width / image.size.width
-                let ratioH = imageVideoContainer.frame.height / image.size.height
-                let ratio = ratioW < ratioH ? ratioW : ratioH
-                let imageHeight = image.size.height * ratio
-                imageViewConstraint = detailView.frame.height - ((self.view.frame.height - imageHeight) / 2) + self.view.safeAreaInsets.bottom
-                if imageViewConstraint < 0 { imageViewConstraint = 0 }
-            }
-            
-            UIView.animate(withDuration: 0.3) {
-                self.imageViewTopConstraint.constant = -self.imageViewConstraint
-                self.imageViewBottomConstraint.constant = self.imageViewConstraint
-                self.view.layoutIfNeeded()
-            } completion: { (_) in
-            }
-            
-            scrollView.pinchGestureRecognizer?.isEnabled = false
-            playerToolBar.hideToolBar()
+        self.detailView.show(textColor: self.viewerMedia?.textColor)
+        
+        if let image = imageVideoContainer.image {
+            let ratioW = imageVideoContainer.frame.width / image.size.width
+            let ratioH = imageVideoContainer.frame.height / image.size.height
+            let ratio = ratioW < ratioH ? ratioW : ratioH
+            let imageHeight = image.size.height * ratio
+            imageViewConstraint = self.detailView.frame.height - ((self.view.frame.height - imageHeight) / 2) + self.view.safeAreaInsets.bottom
+            if imageViewConstraint < 0 { imageViewConstraint = 0 }
         }
+        
+        UIView.animate(withDuration: 0.3) {
+            self.imageViewTopConstraint.constant = -self.imageViewConstraint
+            self.imageViewBottomConstraint.constant = self.imageViewConstraint
+            self.detailViewConstraint.constant = self.detailView.frame.height
+            self.view.layoutIfNeeded()
+        } completion: { (_) in
+        }
+        
+        scrollView.pinchGestureRecognizer?.isEnabled = false
+        
+        playerToolBar.hideToolBar()
     }
     
     private func closeDetail() {
         
-//        detailView?.hide()
+        self.detailView.hide()
         imageViewConstraint = 0
         
         UIView.animate(withDuration: 0.3) {
             self.imageViewTopConstraint.constant = 0
             self.imageViewBottomConstraint.constant = 0
+            self.detailViewConstraint.constant = 0
             self.view.layoutIfNeeded()
         } completion: { (_) in
-            self.detailView?.removeFromSuperview()
-            self.detailView = nil
         }
         
         scrollView.pinchGestureRecognizer?.isEnabled = true