UIScrollView Zooming & contentInset
Your approach looks correct. You need to update your code as below.
func scrollViewDidZoom(scrollView: UIScrollView) { if scrollView.zoomScale > 1 { if let image = imageView.image { let ratioW = imageView.frame.width / image.size.width let ratioH = imageView.frame.height / image.size.height let ratio = ratioW < ratioH ? ratioW:ratioH let newWidth = image.size.width*ratio let newHeight = image.size.height*ratio let left = 0.5 * (newWidth * scrollView.zoomScale > imageView.frame.width ? (newWidth - imageView.frame.width) : (scrollView.frame.width - scrollView.contentSize.width)) let top = 0.5 * (newHeight * scrollView.zoomScale > imageView.frame.height ? (newHeight - imageView.frame.height) : (scrollView.frame.height - scrollView.contentSize.height)) scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left) } } else { scrollView.contentInset = UIEdgeInsetsZero }}
Swift 5
func scrollViewDidZoom(scrollView: UIScrollView) { if scrollView.zoomScale > 1 { if let image = imageView.image { let ratioW = imageView.frame.width / image.size.width let ratioH = imageView.frame.height / image.size.height let ratio = ratioW < ratioH ? ratioW:ratioH let newWidth = image.size.width*ratio let newHeight = image.size.height*ratio let left = 0.5 * (newWidth * scrollView.zoomScale > imageView.frame.width ? (newWidth - imageView.frame.width) : (scrollView.frame.width - scrollView.contentSize.width)) let top = 0.5 * (newHeight * scrollView.zoomScale > imageView.frame.height ? (newHeight - imageView.frame.height) : (scrollView.frame.height - scrollView.contentSize.height)) scrollView.contentInset = UIEdgeInsets(top: top, left: left, bottom: top, right: left) } } else { scrollView.contentInset = .zero }}
Swift 5
func scrollViewDidZoom(_ scrollView: UIScrollView) { if scrollView.zoomScale > 1 { if let image = imageView.image { let ratioW = imageView.frame.width / image.size.width let ratioH = imageView.frame.height / image.size.height let ratio = ratioW < ratioH ? ratioW : ratioH let newWidth = image.size.width * ratio let newHeight = image.size.height * ratio let left = 0.5 * (newWidth * scrollView.zoomScale > imageView.frame.width ? (newWidth - imageView.frame.width) : (scrollView.frame.width - scrollView.contentSize.width)) let top = 0.5 * (newHeight * scrollView.zoomScale > imageView.frame.height ? (newHeight - imageView.frame.height) : (scrollView.frame.height - scrollView.contentSize.height)) scrollView.contentInset = UIEdgeInsets(top: top, left: left, bottom: top, right: left) } } else { scrollView.contentInset = UIEdgeInsets.zero }}
for swift 4
func scrollViewDidZoom(_ scrollView: UIScrollView) { if scrollView.zoomScale > 1 { if let image = self.imageViewZoom.image { let ratioW = self.imageViewZoom.frame.width / image.size.width let ratioH = self.imageViewZoom.frame.height / image.size.height let ratio = ratioW < ratioH ? ratioW:ratioH let newWidth = image.size.width*ratio let newHeight = image.size.height*ratio let left = 0.5 * (newWidth * scrollView.zoomScale > self.imageViewZoom.frame.width ? (newWidth - self.imageViewZoom.frame.width) : (scrollView.frame.width - scrollView.contentSize.width)) let top = 0.5 * (newHeight * scrollView.zoomScale > self.imageViewZoom.frame.height ? (newHeight - self.imageViewZoom.frame.height) : (scrollView.frame.height - scrollView.contentSize.height)) scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left) } } else { scrollView.contentInset = UIEdgeInsets.zero } }