【问题标题】:Interface Builder: automatically set aspect ratio for UIImageView when using "Aspect Fit"?Interface Builder:使用“Aspect Fit”时自动设置 UIImageView 的纵横比?
【发布时间】:2018-06-06 11:38:27
【问题描述】:

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

使用 AutoLayout 将 Interface Builder 中的高度固定为 23 像素,然后将 Aspect Fit 用于 Content Mode 不会改变框架矩形。

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

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

但这非常脆弱。如果您更改图像尺寸,您必须记住调整纵横比。

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

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

框架矩形在 IB 中没有改变:

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

【问题讨论】:

  • .contentMode 不会改变框架。只有图像在框架内的显示方式。我认为实现你想要的唯一方法是使用代码。
  • @Demosthese 如果你是对的,这很令人沮丧。框架随内容而变化更有意义,否则您会遇到上述对齐问题。啊,苹果!
  • 嗯,在代码中非常容易做到。就像一条线。为什么不呢?
  • @Demosthese 因为还有更多图标 :)

标签: ios uiimageview autolayout storyboard interface-builder


【解决方案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)
    }

}

【讨论】:

  • 非常感谢!令人沮丧的是,这不是 IB 自动完成的。为什么调整内容而不调整框架???或许有什么原因,但一点都不清楚。
猜你喜欢
  • 2014-12-09
  • 2011-03-17
  • 2015-02-28
  • 2014-06-13
  • 2015-07-01
  • 2012-03-04
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多