UIScrollView Zooming & contentInset

前端 未结 3 1525
你的背包
你的背包 2021-01-31 10:39

Simliar to iOS Photos App where the user is zooming in and out of an image by pinching:

UIView > UIScrollView > UIImageView > UIImage

Initially, I had the issue

相关标签:
3条回答
  • 2021-01-31 10:55

    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
            }
        }
    
    0 讨论(0)
  • 2021-01-31 10:59

    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
        }
    }
    
    0 讨论(0)
  • 2021-01-31 11:18

    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
        }
    }
    
    0 讨论(0)
提交回复
热议问题