【问题标题】:Pinch to Zoom UIImageView捏缩放 UIImageView
【发布时间】:2020-10-01 08:50:21
【问题描述】:

我有一个图像视图作为 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()
    }
}

有什么想法吗?

我现在尝试按照建议的教程进行操作,效果稍微好一些,但图像放大且很大。

即使我按照教程进行操作,我的限制仍然会给我带来问题。

【问题讨论】:

  • 此答案基于(可能)您遵循的相同教程 - 但我通过代码而不是情节提要布局完成并允许将图像设置为 Aspect Fit 或 Aspect Fill:stackoverflow.com/a/62329613/6257435跨度>

标签: ios swift uiscrollview uiimageview


【解决方案1】:

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

1 - 您错过了设置滚动视图委托(除非您在 Storyboard 中设置)。如果您没有在情节提要中设置它:

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 - 要消除 Storyboard 中的约束错误,请为图像视图提供宽度和高度约束(例如每个 100),并将它们设置为占位符,这样它们就不会在运行时使用:

【讨论】:

  • 完美。谢谢你。我在情节提要中设置了代表,但你们其他人的建议都奏效了。
【解决方案2】:

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

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

【讨论】:

  • 这应该是一条评论,因为它没有回答问题。
猜你喜欢
  • 2015-07-12
  • 2012-11-24
  • 2019-11-13
  • 2017-09-23
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多