[英]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.