我想创建一个UIView
使用/提供 IntrinsicContentSize 的自定义,因为它的高度取决于其内容(就像高度取决于文本的标签一样)。
虽然我找到了很多关于如何使用现有视图提供的 IntrinsicContentSize 的信息,但我发现了一些关于如何在自定义上使用 IntrinsicContentSize 的信息UIView
:
@IBDesignable class MyIntrinsicView: UIView {
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(UIColor.gray.cgColor)
context?.fill(CGRect(x: 0, y: 0, width: frame.width, height: 25))
height = 300
invalidateIntrinsicContentSize()
}
@IBInspectable var height: CGFloat = 50
override var intrinsicContentSize: CGSize {
return CGSize(width: super.intrinsicContentSize.width, height: height)
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
invalidateIntrinsicContentSize()
}
}
初始高点设置为
50
这些
draw
方法绘制一个大小为灰色的矩形25
高度更改为
300
并invalidateIntrinsicContentSize()
称为在 InterfaceBuilder 中放置一个
MyView
实例没有任何问题。视图不需要高度约束
但是,在 IB 中使用初始高度50
。为什么?IB 绘制灰色矩形,因此该draw
方法被调用。那么为什么高度没有改为300呢?
还有什么奇怪的:当设置背景颜色时,它也被绘制,也super.draw(...)
没有被调用。这是故意的吗?
我希望有一个高度为 的视图,300
顶部有一个高度为 的灰色矩形25
。但是,在模拟器中运行项目时,结果是不同的:
- 视图的高度 =
300
-好的 - 内容高度(= 灰色矩形)= 150(半视图高度) -不正常
似乎内容已从其原始高度拉伸,25
以保持其与视图的相对高度。为什么是这样?