我可以仅调整imageView的图像大小吗?

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

所以我有这个代码:

override func viewDidLoad() {
        super.viewDidLoad()
        let imageView = UIImageView()
        view.addSubview(imageView)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.layer.borderWidth = 5
        imageView.layer.borderColor = UIColor.green.cgColor
        NSLayoutConstraint.activate([
            imageView.heightAnchor.constraint(equalToConstant: 200),
            imageView.widthAnchor.constraint(equalToConstant: 200),
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0),
            imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0),
        ])
        let image = UIImage(named: "3")
        //let image = UIImage(named: "3")?.resizeImageWith(newSize: CGSize(width: 5,height: 5))
        imageView.image = image
    }

看起来像这样:enter image description here

我正在尝试使用此扩展名调整图像的大小(例如,从绿色边框开始留有空白):

func resizeImageWith(newSize: CGSize) -> UIImage {
        let horizontalRatio = newSize.width / size.width
        let verticalRatio = newSize.height / size.height
        let ratio = min(horizontalRatio, verticalRatio)
        let newSize = CGSize(width: size.width * ratio, height: size.height * ratio)
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
        draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }

但是当我这样使用时:

let image = UIImage(named: "3")?.resizeImageWith(newSize: CGSize(width: 60,height: 60))

我得到以下结果:enter image description here

并且与此相同:

let image = UIImage(named: "3")?.resizeImageWith(newSize: CGSize(width: 5,height: 5))

图像变得最糟。是否可以仅调整图像大小以在imageView中留有余量?谢谢!enter image description here

ios swift uiimageview uiimage
1个回答
0
投票

我能够产生您想要的东西,但消除了约束。使用将imageView作为子视图的容器视图,可以像框架一样使用容器并设置其边框宽度和颜色。

框架就位,然后只需设置imageView的框架即可根据需要调整图像的大小。代码的最后两行已被注释掉,但是如果您取消注释它们,则会看到图像将缩小以适应新的imageView帧大小,该帧大小设置为(50,50)。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let containerView = UIView()

        containerView.layer.borderWidth = 5
        containerView.layer.borderColor = UIColor.green.cgColor

        containerView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        containerView.center = view.center

        let imageView = UIImageView()

        view.addSubview(containerView)
        containerView.addSubview(imageView)


        let image = UIImage(named: "3")!
        imageView.frame = CGRect(origin: imageView.frame.origin, size: CGSize(width: 200, height: 200))
        imageView.image = image
        imageView.contentMode = .scaleAspectFit
        imageView.center = view.convert(containerView.center, to: containerView)

        print("Image Width: \(image.size.width)")
        print("Image Height: \(image.size.height)")

        print("ImageView Width: \(imageView.frame.width)")
        print("ImageView Height: \(imageView.frame.height)")

        print("Container Width: \(containerView.frame.width)")
        print("Container Height: \(containerView.frame.height)")

        print("View Center: \(view.center.x),\(view.center.y)")
        print("Container Center: \(containerView.center.x),\(containerView.center.y)")

        //imageView.frame.size = CGSize(width: 50, height: 50)
        //imageView.center = view.convert(containerView.center, to: containerView)

    }
}

我使用了.scaleAspectFit,以便图像将被强制适应您将imageView设置为的任何大小,同时保持其原始纵横比。当然,您也可以更改此设置以适合您的需求。如果需要以其他方式设置图像的大小,则需要适当更改imageView的contentMode属性。更多信息在这里:

https://developer.apple.com/documentation/uikit/uiimageview

转换功能仅有助于在其父视图内将imageView布局到所需位置。

打印调试语句对于检查布局很有帮助,但当然是不必要的。

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