Interface Builder:使用" Aspect Fit"?

时间:2017-12-25 00:16:54

标签: ios uiimageview autolayout storyboard interface-builder

下面的共享图标(图像为白色)为114x128像素。

使用AutoLayout将界面生成器中的高度固定为23像素,然后使用内容模式 内容模式不会更改框架矩形。

这会导致对齐问题,因为如果您希望图标距后缘15个像素,那么现在很难这样做。

一种选择是手动将宽高比(即114/128)设置为IB内的AutoLayout约束。

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

有没有办法让IB自动调整框架矩形和内容?

最后一个选项是在代码中执行所有操作,但在IB中执行所有操作都是理想的选择。

在IB中不改变框架矩形:

enter image description here

分享图标(此处不显示白色图标):

enter image description here

1 个答案:

答案 0 :(得分:1)

我相信你必须以编程方式执行此操作。如果您不希望按视图进行查看,只需定义一些子类(您可以指定为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)
    }

}