Interface Builder:使用“Aspect Fit”时自动为UIImageView设置宽高比?

下面的共享图标(图像是白色的)是114×128像素。

尽pipe在Interface Builder中使用AutoLayout将高度固定为23像素,然后使用Aspect Fit作为内容模式并不会改变帧矩形。

这会导致alignment问题,因为如果你想要从后边缘的15像素的图标,现在很难这样做。

一种select是手动将纵横比(即114/128)设置为IB内的自动布局约束。

但这是非常脆弱的。 如果您更改图像尺寸,则必须记住调整高宽比。

有没有一种方法,IB自动调整框架矩形以及内容?

最后一个select是在代码中做所有事情,但是在IB中做所有事情都是理想的。

IB矩形不改变:

在这里输入图像说明

分享图标(白色图标在此不可见):

在这里输入图像说明

我相信你将不得不以编程方式做到这一点。 如果您不想按视图进行查看,只需定义一些子类(您可以在IB中指定为基类)以编程方式设置约束

class RatioImageView: UIImageView { private var ratioConstraint: NSLayoutConstraint? override var image: UIImage? { didSet { updateRatioConstraint() } } override func didMoveToSuperview() { super.didMoveToSuperview() updateRatioConstraint() } private func updateRatioConstraint() { if let ratioConstraint = ratioConstraint { removeConstraint(ratioConstraint) } guard superview != nil else { return } let ratio: CGFloat if let image = image { ratio = image.size.width / image.size.height } else { ratio = 1 } ratioConstraint = widthAnchor.constraint(equalTo: heightAnchor, multiplier: ratio) ratioConstraint?.isActive = true } } 

这在一个图像视图,但你可能会做同样的UIButton或任何,也一样。


或者在主题的另一个变体中,可以用内在大小来控制它,也许你明确地设置了height (因为这是@IBInspectable ,你可以在IB中这样做),它会返回缩放的固有尺寸高度:

 @IBDesignable class RatioImageView: UIImageView { @IBInspectable var height: CGFloat = 0 override var intrinsicContentSize: CGSize { guard let image = image else { return .zero } guard height > 0 else { return image.size } let ratio = image.size.width / image.size.height return CGSize(width: height * ratio, height: height) } }