Ios Interface Builder:使用“时自动设置UIImageView的纵横比”;Aspect Fit;?
下面的共享图标(图像为白色)为114x128像素 但是,使用AutoLayout将Interface Builder中的高度固定为23像素,然后使用内容模式的Aspect Fit不会更改框架矩形 这会导致对齐问题,因为如果希望图标距离后缘15像素,现在很难做到这一点 一个选项是手动设置纵横比(即114/128)作为IB内的自动布局约束 但这是非常脆弱的。如果更改图像尺寸,必须记住调整纵横比 有没有一种IB自动调整框架矩形和内容的方法 最后一种选择是在代码中完成所有操作,但在IB中完成所有操作都是理想的 帧矩形在IB中不改变: 共享图标(白色图标,此处不可见):Ios Interface Builder:使用“时自动设置UIImageView的纵横比”;Aspect Fit;?,ios,uiimageview,autolayout,storyboard,interface-builder,Ios,Uiimageview,Autolayout,Storyboard,Interface Builder,下面的共享图标(图像为白色)为114x128像素 但是,使用AutoLayout将Interface Builder中的高度固定为23像素,然后使用内容模式的Aspect Fit不会更改框架矩形 这会导致对齐问题,因为如果希望图标距离后缘15像素,现在很难做到这一点 一个选项是手动设置纵横比(即114/128)作为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
}
}
这可以在图像视图上实现,但您也可以使用ui按钮
或其他类似的功能
或者在主题的另一个变体中,您可以使用内部大小来控制这一点,您可以显式地设置
高度
(因为这是@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)
}
}
.contentMode不会更改帧。只有图像在帧内的显示方式。我认为实现您想要的东西的唯一方法是使用代码。@演示如果您是对的,这是令人沮丧的。框架会随着内容的变化而变化,否则会遇到上述对齐问题,这就更有意义了。啊,苹果!好吧,用代码做起来非常简单。就像一行。为什么不呢?@Demosthese因为还有很多图标:)非常感谢!令人沮丧的是,IB并没有自动完成这项工作。为什么要调整内容而不是框架???也许有一些原因,但一点也不清楚。