因此,我将 SChartCrosshairMultiValueTooltip 子类化以实现自定义多值 (OHLC) 工具提示。我可以从图表中获取 OHLC 数据。但是我很难理解如何以 Shinobi 框架想要的方式呈现数据。
具体来说,我不明白如何使用该labels
属性。我首先假设它将预先填充由超类调用生成的标签keyValueDisplayPairsForDataPoint:onSeries:withXAxis:withYAxis:
,但这是不正确的,因为调试器显示标签数组为空。
labels
所以我尝试调用该方法并在我的重写方法中手动将 UILabel 添加到数组中- (void)setDataPoint:(id<SChartData>)dataPoint fromSeries:(SChartSeries *)series fromChart:(ShinobiChart *)chart
,但没有显示任何内容。所以然后我尝试将它们作为子视图添加到 self.view。那行得通,但是因为我自己刚刚添加了它们,所以它们没有根据工具提示设置样式,而且无论如何这感觉不对,因为如果我必须自己做所有事情,那么子类化几乎没有意义。我还必须确保[self layoutContents]
不要求这样做,这感觉双重错误。
如上所述工作的代码如下所示:-
- (void)setDataPoint:(id<SChartData>)dataPoint fromSeries:(SChartSeries *)series fromChart:(ShinobiChart *)chart
{
SChartMultiYDataPoint *dp = (SChartMultiYDataPoint *)dataPoint;
NSDictionary *dict = [self keyValueDisplayPairsForDataPoint:dp onSeries:series withXAxis:chart.xAxis withYAxis:chart.yAxis];
for (UILabel *label in self.labels)
{
[label removeFromSuperview];
}
[self.labels removeAllObjects];
CGFloat y = 0;
const CGFloat kHeight = 25.0f;
for (id key in [dict allKeys])
{
UILabel *keyLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, y, 80, kHeight)];
keyLabel.text = key;
UILabel *valueLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, y, 80, kHeight)];
valueLabel.text = dict[key];
[self.labels addObject:keyLabel];
[self.labels addObject:valueLabel];
y += kHeight;
[self addSubview:keyLabel];
[self addSubview:valueLabel];
}
}
- (void)setPosition:(struct SChartPoint)pos onCanvas:(SChartCanvas *)canvas
{
// [self layoutContents]; // do NOT call this
self.frame = CGRectMake(0, 0, 160, 100);
}
有谁知道更好的方法?