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

问题描述 投票:0回答:1

我有一个具有UIScrollView的UIViewController。在后一个视图中,有一个UIImageView。我已经实现了UIImageView,以便用户可以放大/缩小。但是,一开始我希望用户在决定放大/缩小之前先查看整个UIImage。目前,UIImage只是自动放大。关于stackOverflow的很多答案都建议将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
}
swift uiscrollview
1个回答
0
投票

您想将.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
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.