【发布时间】:2021-08-27 16:40:54
【问题描述】:
我想创建一个使用/提供 IntrinsicContentSize 的自定义 UIView,因为它的高度取决于其内容(就像高度取决于文本的标签一样)。
虽然我发现了很多关于如何使用现有视图提供的 IntrinsicContentSize 的信息,但我发现了一些关于如何在自定义 UIView 上使用 IntrinsicContentSize 的信息:
@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 拉伸以保持其相对于视图的高度。这是为什么呢?
【问题讨论】:
标签: ios uiview autolayout intrinsic-content-size