UIScrollView 中的 UIImageView 中的 UIImage 会自动放大 - 如何最初查看整个 UIImage?

UIImage in UIImageView that is in UIScrollView is automatically zoomed in - how to initially view whole UIImage?

我有一个带有 UIScrollView 的 UIViewController。在后一个视图中有一个 UIImageView。我已经实现了 UIImageView,以便用户可以缩放 in/out。但是,一开始我希望用户在决定缩放之前看到整个 UIImage in/out。目前 UIImage 只是自动放大。 Whosebug 上的很多答案都建议将 UIImageView.contentMode 设置为 scaleAspectFit - 我已经这样做了,但没有奏效。

class ViewImageViewController: UIViewController, UIScrollViewDelegate {

var imageToPresent: UIImage!
let scrollView: UIScrollView = {
    let view = UIScrollView()
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let imageView: UIImageView = {
   let imgView = UIImageView()
    imgView.backgroundColor = UIColor.black
    imgView.contentMode = .scaleAspectFit
    imgView.isUserInteractionEnabled = true
    imgView.translatesAutoresizingMaskIntoConstraints = false
    return imgView
}()


override func viewDidLoad() {
    super.viewDidLoad()
    print("ViewImageViewController.viewDidLoad")

    view.backgroundColor = UIColor.appGrayForLabels
    setupViews()
    scrollView.delegate = self
}


private func setupViews(){
    view.addSubview(scrollView)
    scrollView.minimumZoomScale = 1.0
    scrollView.maximumZoomScale = 4.0
    scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true


    guard let img = imageToPresent else{return}
    imageView.image = img
    scrollView.addSubview(imageView)
    imageView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    imageView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    imageView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    imageView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
}

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    scrollView.isScrollEnabled = true
    return imageView
}

您想将 .minimumZoomScale 设置为图像大小与滚动视图大小之间的比率,然后将 .zoomScale 设置为该值作为开始。

这是您的代码,稍作修改:

class ViewImageViewController: UIViewController, UIScrollViewDelegate {

    var imageToPresent: UIImage!

    let scrollView: UIScrollView = {
        let view = UIScrollView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    let imageView: UIImageView = {
        let imgView = UIImageView()
        imgView.backgroundColor = UIColor.black
        imgView.contentMode = .scaleAspectFit
        imgView.isUserInteractionEnabled = true
        imgView.translatesAutoresizingMaskIntoConstraints = false
        return imgView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        print("ViewImageViewController.viewDidLoad")

        if let img = UIImage(named: "background") {
            imageToPresent = img
        }

        view.backgroundColor = .gray // UIColor.appGrayForLabels
        setupViews()
        scrollView.delegate = self

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let scrollViewFrame = scrollView.frame
        let scaleWidth = scrollViewFrame.size.width / imageToPresent.size.width
        let scaleHeight = scrollViewFrame.size.height / imageToPresent.size.height

        let minScale = min(scaleWidth, scaleHeight)

        scrollView.minimumZoomScale = minScale
        scrollView.maximumZoomScale = 4.0

        scrollView.zoomScale = minScale
    }

    private func setupViews(){

        scrollView.isScrollEnabled = true

        view.addSubview(scrollView)

        scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true


        guard let img = imageToPresent else{return}
        imageView.image = img
        scrollView.addSubview(imageView)

        let g = scrollView.contentLayoutGuide

        imageView.topAnchor.constraint(equalTo: g.topAnchor).isActive = true
        imageView.bottomAnchor.constraint(equalTo: g.bottomAnchor).isActive = true
        imageView.leadingAnchor.constraint(equalTo: g.leadingAnchor).isActive = true
        imageView.trailingAnchor.constraint(equalTo: g.trailingAnchor).isActive = true

        imageView.widthAnchor.constraint(equalToConstant: imageToPresent.size.width).isActive = true
        imageView.heightAnchor.constraint(equalToConstant: imageToPresent.size.height).isActive = true

    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }

}