当宽度为设备宽度和高度为原始图像的高度时,UIImageView中的图像被剪裁

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

我创建了一个ImageViewController,用于查看长图像。 (比如漫画应用)

但是,因为它是UIImageView的宽度是设备宽度,高度是原始大小(宽高比)

但图像被裁剪。我该怎么做?

UI代码

    fileprivate let scrollView = UIScrollView().then {
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.backgroundColor = .yellow
        $0.bounces = false
    }

    fileprivate let stackView = UIStackView().then {
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.axis = .vertical
    }

    // MARK: - View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(self.scrollView)
        self.scrollView.addSubview(self.stackView)

        self.scrollView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        self.stackView.snp.makeConstraints { make in
            make.edges.equalTo(self.scrollView)
        }

    }

添加UIImageView代码


for element in lists {
    let imgView = UIImageView()
    imgView.setImage(element) // set image from url

    imgView.contentMode = .scaleAspectFill

    imgView.clipsToBounds = true
    imgView.translatesAutoresizingMaskIntoConstraints = false
    self.stackView.addArrangedSubview(imgView)
    imgView.widthAnchor.constraint(equalTo:    self.scrollView.widthAnchor, multiplier: 1.0).isActive = true
    imgView.heightAnchor.constraint(equalTo:     self.scrollView.heightAnchor, multiplier: 1.0).isActive = true
}

如何宽高比(最大宽度)UIImageView?


我找到了解决方案

添加下面的代码,

func imageScaled(with sourceImage: UIImage?, scaledToWidth i_width: Float) -> UIImage? {
        let oldWidth = Float(sourceImage?.size.width ?? 0.0)
        let scaleFactor: Float = i_width / oldWidth

        let newHeight = Float((sourceImage?.size.height ?? 0.0) * CGFloat(scaleFactor))
        let newWidth: Float = oldWidth * scaleFactor
        print(newHeight)

        UIGraphicsBeginImageContext(CGSize(width: CGFloat(newWidth), height: CGFloat(newHeight)))
        sourceImage?.draw(in: CGRect(x: 0, y: 0, width: CGFloat(newWidth), height: CGFloat(newHeight)))
        let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

然后,设置为UIImageView。

imgView.setImageScaled(element, width: Float(self.scrollView.frame.width))
swift uiimageview snapkit
1个回答
0
投票

由于你的图像高度比iphone的显示高度要高,你必须将你的图像视图放在scrollView中并将内容模式设置为.scaleAspectFit并将imageView的高度设置为等于图像的高度

imgView.contentMode = .scaleAspectFit
© www.soinside.com 2019 - 2024. All rights reserved.