代码之家  ›  专栏  ›  技术社区  ›  raginggoat

捏住以缩放UIImageView

  •  0
  • raginggoat  · 技术社区  · 4 年前

    我有一个图像视图作为UIScrollView的子视图,以便能够缩放图像。它有点奏效,但效果不佳。

         class LargeImageViewController: UIViewController {
    
        @IBOutlet weak var scrollView: UIScrollView!
        @IBOutlet weak var imageView: UIImageView!
    
        @IBOutlet weak var imageViewBottomConstraint: NSLayoutConstraint!
        @IBOutlet weak var imageViewLeadingConstraint: NSLayoutConstraint!
        @IBOutlet weak var imageViewTopConstraint: NSLayoutConstraint!
        @IBOutlet weak var imageViewTrailingConstraint: NSLayoutConstraint!
    
        var selectedImage: UIImage?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let image = selectedImage {
                imageView.image = image
            }
        }
    
        override func viewWillLayoutSubviews() {
          super.viewWillLayoutSubviews()
          updateMinZoomScaleForSize(view.bounds.size)
        }
    
        func updateMinZoomScaleForSize(_ size: CGSize) {
            let widthScale = size.width / imageView.bounds.width
            let heightScale = size.height / imageView.bounds.height
            let minScale = min(widthScale, heightScale)
    
            scrollView.minimumZoomScale = minScale
            scrollView.zoomScale = minScale
        }
    
        @IBAction func doneTapped(_ sender: Any) {
            dismiss(animated: true, completion: nil)
        }
    }
    
    extension LargeImageViewController: UIScrollViewDelegate {
        func viewForZooming(in scrollView: UIScrollView) -> UIView? {
            return imageView
        }
    
        func scrollViewDidZoom(_ scrollView: UIScrollView) {
          updateConstraintsForSize(view.bounds.size)
        }
    
        func updateConstraintsForSize(_ size: CGSize) {
          let yOffset = max(0, (size.height - imageView.frame.height) / 2)
          imageViewTopConstraint.constant = yOffset
          imageViewBottomConstraint.constant = yOffset
    
          let xOffset = max(0, (size.width - imageView.frame.width) / 2)
          imageViewLeadingConstraint.constant = xOffset
          imageViewTrailingConstraint.constant = xOffset
    
          view.layoutIfNeeded()
        }
    }
    

    有什么想法吗?

    我现在已经尝试按照教程建议进行操作,它的表现要好一些,但图像被放大了,而且很大。 enter image description here

    尽管我遵循了教程,但我的约束仍然给我带来了问题。 enter image description here

    0 回复  |  直到 4 年前
        1
  •  1
  •   DonMag    4 年前

    你的代码不像教程那样工作的原因有几个。

    1-您错过了设置滚动视图代理(除非在情节提要中设置)。如果你这样做了 在故事板中设置它:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let image = selectedImage {
            imageView.image = image
        }
    
        // add this
        scrollView.delegate = self
    }
    

    2-它仍然不太正确,因为教程在Storyboard中设置了图像,但你在 viewDidLoad() 。要解决此问题,请执行以下操作:

    // remove this
    //override func viewWillLayoutSubviews() {
    //  super.viewWillLayoutSubviews()
    //  updateMinZoomScaleForSize(view.bounds.size)
    //}
    
    // add this
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateMinZoomScaleForSize(scrollView.bounds.size)
        updateConstraintsForSize(scrollView.bounds.size)
    }
    

    3-要消除情节提要中的约束错误,请为图像视图设置宽度和高度约束(例如每个100),并将其设置为占位符,这样它们在运行时就不会被使用:

    enter image description here

        2
  •  -1
  •   user3524337    4 年前

    无法确定问题在哪里,因为您可能也配置了故事板/xib文件。

    但是,我建议您阅读指南: https://www.raywenderlich.com/5758454-uiscrollview-tutorial-getting-started .