缩小图像,将其添加为视图层的内容

问题描述

我想将图像设置为视图的内容,但是我不希望图像占据整个画面。我希望图像变小。为此,我试图将contentRect设置为主层的80%。

 self.layer.contents = UIImage(named: "plus")?.cgImage
 self.layer.contentsRect = self.layer.frame.insetBy(dx: 5,dy: 5)

但这不起作用。调试后,我意识到该层的框架是

▿ (256.0,398.0,100.0,100.0)

和contectsRect是

▿ (261.0,403.0,90.0,90.0)

enter image description here

但是它仍然不能解决问题,这意味着图像不会变小。谁能告诉我如何解决此问题。

解决方法

这是一种方法。

  • 子类UIView
  • 添加“图像” CALayer作为子层
  • layoutSubviews()中设置图像图层的内容和框架(或添加您自己的功能来设置图像图层的内容)

示例代码:

class Image80View: UIView {
    
    let imgLayer = CALayer()
    var img: UIImage?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        layer.addSublayer(imgLayer)
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        if let img = self.img {
            imgLayer.contents = img.cgImage
        }
        // 10% on each side,so 80% of view
        imgLayer.frame = bounds.insetBy(dx: bounds.width * 0.1,dy: bounds.height * 0.1)
    }
    
}

class TestViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let testView = Image80View()
        testView.translatesAutoresizingMaskIntoConstraints = false
        if let img = UIImage(named: "plus") {
            testView.img = img
        }

        view.addSubview(testView)

        NSLayoutConstraint.activate([
            testView.widthAnchor.constraint(equalToConstant: 200.0),testView.heightAnchor.constraint(equalTo: testView.widthAnchor),testView.centerXAnchor.constraint(equalTo: view.centerXAnchor),testView.centerYAnchor.constraint(equalTo: view.centerYAnchor),])

        // so we see the view's frame
        testView.backgroundColor = .green
    }
    
}