         imageView.image = image
       }
       updateScrollViewAndImageViewForCurrentMetrics()
+
+      if let relativeZoomScaleBeforeUpdate = relativeZoomScaleBeforeUpdate,
+         let relativeCenterBeforeUpdate = relativeCenterBeforeUpdate,
+               relativeZoomScaleBeforeUpdate > 1 {
+        // Since navigation require zoom level to be at 1, so zoomScale > 1 implies that this image set is trigger by image update instead cell re-use.
+        // In this case we retain the pre-update zoom scale & position
+        zoom(to: CGPoint(x: scrollView.frame.size.width * relativeCenterBeforeUpdate.x, y: scrollView.frame.size.height * relativeCenterBeforeUpdate.y), scale: relativeZoomScaleBeforeUpdate)
+      }
     }
   }
   weak var delegate: AgrumeCellDelegate?

  private var imageDragOffsetFromActualTranslation: UIOffset!
  private var imageDragOffsetFromImageCenter: UIOffset!
  private var attachmentBehavior: UIAttachmentBehavior?

  var image: UIImage? {
    didSet {


  override func prepareForReuse() {
    super.prepareForReuse()

    relativeZoomScaleBeforeUpdate = scrollView.zoomScale
    relativeCenterBeforeUpdate = CGPoint(
      x: (scrollView.contentOffset.x + scrollView.frame.width / 2) / scrollView.contentSize.width,
      y: (scrollView.contentOffset.y + scrollView.frame.height / 2) / scrollView.contentSize.height)

    imageView.image = nil
    scrollView.zoomScale = 1
    updateScrollViewAndImageViewForCurrentMetrics()
