UIImageView 忽略 UIStackView 中的 widthAnchor

问题描述

我正在尝试在 UIStackView 中对齐和缩放图像

class logoLine: UIViewController {  
    override func viewDidLoad() {
        let label = UILabel()
        label.text = "powered by"
        label.textColor = .label
        label.textAlignment = .center
        
        let logoToUse = UIImage(named: "Image")
        let imageView = UIImageView(image: logoToUse!)
        
        let stackView = UIStackView(arrangedSubviews: [label,imageView])
        stackView.axis = .vertical
        stackView.distribution = .fillProportionally

        view.addSubview(stackView)
        
        stackView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            imageView.widthAnchor.constraint(equalToConstant: 50),// this gets ignored
            stackView.topAnchor.constraint(equalTo: self.view.topAnchor),stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),view.heightAnchor.constraint(equalTo: stackView.heightAnchor)
        ])
    }
    
}

这是在模拟器中的样子(从一个边界到另一个边界):

enter image description here

问题:为什么 UIImageView 忽略了我的 50pt 的 widthAnchor 约束,为什么原始图像的纵横比会改变?如何将 UIImage(或 UIImageView)限制为例如屏幕宽度的一半保持纵横比?

解决方法

默认情况下,垂直堆栈视图具有 .alignment = .fill ... 因此它将拉伸排列的子视图以“填充堆栈视图的宽度。”

改为:

stackView.alignment = .center

顺便说一下,去掉 stackView.distribution = .fillProportionally ...几乎肯定不是你想要的。