1

因此,我将 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);
}

有谁知道更好的方法?

4

0 回答 0