所以我将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);
}
有没有人知道更好的方法?