【问题标题】:Can I resize just the image of an imageView?我可以只调整 imageView 的图像大小吗?
【发布时间】:2019-10-12 23:11:48
【问题描述】:

所以我有这个代码:

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
    }

看起来像这样:

我正在尝试使用此扩展名仅调整图像的大小(就像从绿色边框开始有边距一样):

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))

我得到以下结果:

与此相同:

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

图像变得最糟糕。 是否可以仅调整图像大小以便从 imageView 中获得边距?谢谢!

【问题讨论】:

    标签: ios swift uiimageview uiimage


    【解决方案1】:

    将图像视图内容模式更改为中心:

    imageView.contentMode = .center
    

    【讨论】:

    • 如果您有新问题,请提出新问题。
    【解决方案2】:

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

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

    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

    convert 函数只是帮助在其父视图中将 imageView 布局到您想要的位置。

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

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多