【发布时间】:2021-03-20 09:24:26
【问题描述】:
我从 xib 布局创建标记,但它不会根据标签长度调整大小:
我的标记类:
class MyMarker: MarkerView {
@IBOutlet weak var lblValue: UILabel!
override open func awakeFromNib() {
// centering on top of bar
self.offset.x = -self.frame.size.width / 2.0
self.offset.y = -self.frame.size.height - 7.0
}
override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
lblValue.text = String(entry.y)
}
}
我在 IOS-Charts 库中进行了一些挖掘,发现了一个有趣的功能 - 虽然可以从 xib(其内容是视图)创建标记,但标记本身并未添加到视图层次结构中。相反,视图的内容只是简单地绘制在图表画布上。
如果我们查看MarkerView,我们会注意到它只是一个方便的包装器。图表上的渲染发生在draw(context:point:) 方法中,该方法在IMarker 协议中定义。也就是说,MarkerView 不会添加到视图层次结构中。
在我看来,这可能是MarkerView 的约束没有重新计算的原因。我试图强制 MarkerView 重新计算它们但没有成功:
override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
lblValue.text = String(entry.y)
layoutSubviews() // doesn't work
updateConstraints() // doesn't work
subviews.forEach() { // even that doesn't work!
$0.updateConstraints()
}
}
我什至尝试调整视图边界的大小(为了清晰起见,添加了绿色背景),但这并没有强制重新计算约束:
override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
lblValue.text = String(entry.y)
bounds = CGRect(x: bounds.minX, y: bounds.minY, width: 200, height: bounds.height)
frame = bounds
backgroundColor = UIColor.green
layoutSubviews() // doesn't work
updateConstraints() // doesn't work
subviews.forEach() { // even that doesn't work!
$0.updateConstraints()
}
}
结果:
问题是如何重新计算MarkerView 约束?最重要的是 - 不是手动的。毕竟,MarkerView 在从 xib 初始化时会以某种方式计算正确的约束。
【问题讨论】:
标签: ios swift autolayout ios-charts