下面的共享图标(图像为白色)为114x128像素。
使用AutoLayout将界面生成器中的高度固定为23像素,然后使用内容模式 内容模式不会更改框架矩形。
这会导致对齐问题,因为如果您希望图标距后缘15个像素,那么现在很难这样做。
一种选择是手动将宽高比(即114/128)设置为IB内的AutoLayout约束。
但这非常脆弱。如果更改图像尺寸,则必须记住调整宽高比。
有没有办法让IB自动调整框架矩形和内容?
最后一个选项是在代码中执行所有操作,但在IB中执行所有操作都是理想的选择。
在IB中不改变框架矩形:
分享图标(此处不显示白色图标):
答案 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)
}
}