繁体   English   中英

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

[英]Interface Builder: automatically set aspect ratio for UIImageView when using “Aspect Fit”?

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

但是,使用AutoLayout将Interface Builder中的高度固定为23像素,然后对内容模式使用Aspect Fit不会更改框架矩形。

这会导致对齐问题,因为如果您希望图标距后边缘15像素,则现在很难做到这一点。

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

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

IB是否可以自动调整框架矩形及其内容?

最后一个选择是在代码中进行所有操作,但是在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)
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM