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

标签 swift uiscrollview

我有一个带有 UIScrollView 的 UIViewController。在后一个 View 中有一个 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
}

最佳答案

您想要将 .minimumZoomScale 设置为图像大小与 ScrollView 大小之间的比率,然后将 .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
    }

}

关于swift - UIScrollView 中的 UIImageView 中的 UIImage 自动放大 - 如何最初查看整个 UIImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739992/

相关文章:

ios - UIScrollView 以编程方式使 contectview 的 subview 的动态高度和宽度

ios - 如何在 ViewController 之间传递数组以在 UITableView 中使用(名称,id)?

ios - 使用分段 Controller 重叠 UIView 问题

iOS:在 Interface Builder 中创建具有动态 contentSize 的 UIScrollView

ios - 缩放弹跳 + 导航栏后退按钮点击 = 应用程序崩溃

iphone - 获取 UIScrollView 相对于原始大小的缩放帧

Swift - 如何声明私有(private)嵌套结构?

ios - swift - 如何完成任务

swift - 如何使用 Storyboard ID 滑动 View Controller

ios - 选择 Collection View 单元格时如何在文档目录中传递文件 URL